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


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

[code]

    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
    
[/code]

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

[code]

    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)
    
[/code]

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

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




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

[code]

    res = http.request(request)
    p res.body
    
[/code]

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

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




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

[code]

    res = http.request(request)
    p res.body
    
[/code]

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

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

