curlでのHTTP post を ruby に書き換えで失敗する

投稿者: Anonymous

DropboxにAPI2を使いファイルのアップロードをしたいので下記のcurlコマンドでファイルが正常にアップロードされるのを確認しました。

curl -X POST https://content.dropboxapi.com/2/files/upload 
    --header "Authorization: Bearer $access_token" 
    --header "Content-Type: application/octet-stream" 
    --header "Dropbox-API-Arg: {"path": "test.txt", "mode": "overwrite"}" 
--data-binary @foo.txt

これをRubyのコードにおき変えるために

access_token = ENV['DROPBOX_ACCESS_TOKEN']
uri = URI.parse('https://content.dropboxapi.com')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new("2/files/upload")
request.add_field('Authorization', "Bearer #{access_token}")
request.add_field('Content-Type', 'application/octet-stream')
request.add_field('Dropbox-API-Arg', {path: '/test.txt', mode: 'overwrite'})
request.body = File.read('foo.txt')
http.request(request)

としたのですが #<Net::HTTPBadRequest 400 Bad Request readbody=true>になってしまいました。

400エラーだけでは原因をどのように特定していけばよいのかわからないのですが、このような場合どのようにエラーを取り除けば良いのでしょうか?

解決

レスポンスボディを見るのが手がかりになると思います。

res = http.request(request)
p res.body

最後の一行を上記のように修正すると、どのようなレスポンスが返ってくるのかわかると思います。

ちなみに、
request = Net::HTTP::Post.new("2/files/upload")

request = Net::HTTP::Post.new("/2/files/upload")
だと思うので一緒に修正してみてください。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *