18647


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


CC BY-SA 3.0
2015-11-10T23:48:47.570
18641
2015-11-11T01:43:41.537
3271
question
ruby api dropbox
curlでのHTTP post を ruby に書き換えで失敗する


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

[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")`  
だと思うので一緒に修正してみてください。


CC BY-SA 3.0
2015-11-11T01:43:41.537
18647
2015-11-11T01:43:41.537
2646
18641
answer