web-dev-qa-db-ja.com

HTTPartyを使用してこのPOSTリクエストを実装するにはどうすればよいですか?

RubyのHTTPartyライブラリを使用してAPIエンドポイントにPOSTリクエストを送信するのが困難です。対話しているAPIは Gittip API であり、エンドポイントには認証が必要です。 HTTPartyを使用して、認証されたGETリクエストを正常に行うことができました。

あなたはサンプルコードで見ることができます:

user = "gratitude_test"
api_key = "5962b93a-5bf7-4cb6-ae6f-aa4114c5e4f2"
# I have included real credentials since the above is merely a test account.

HTTParty.get("https://www.gittip.com/#{user}/tips.json", 
             { :basic_auth => { :username => api_key } })

そのリクエストは機能し、期待どおりに次を返します。

[
  {
    "amount" => "1.00",
    "platform" => "gittip",
    "username" => "whit537"
  },
  {
    "amount" => "0.25",
    "platform" => "gittip",
    "username" => "JohnKellyFerguson"
  }
]

ただし、HTTPartyを使用してPOSTリクエストを正常に作成することができませんでした。GittipAPIは、curlを使用してPOSTリクエストを作成することを次のように説明しています。

curl https://www.gittip.com/foobar/tips.json \
  -u API_KEY: \
  -X POST \
  -d'[{"username":"bazbuz", "platform":"gittip", "amount": "1.00"}]' \
  -H"Content-Type: application/json"

次のように、HTTPartyを使用してコードを構造化しようとしましたが(失敗しました)。

user = "gratitude_test"
api_key = "5962b93a-5bf7-4cb6-ae6f-aa4114c5e4f2"

HTTParty.post("https://www.gittip.com/#{user}/tips.json",
              { 
                :body => [ { "amount" => "0.25", "platform" => "gittip", "username" => "whit537" } ],
                :basic_auth => { :username => api_key },
                :headers => { 'Content-Type' => 'application/json' }
               })

最初の引数はURLで、2番目の引数はオプションハッシュです。上記のコードを実行すると、次のエラーが発生します。

NoMethodError: undefined method `bytesize' for [{"amount"=>"0.25", "platform"=>"gittip", "username"=>"whit537"}]:Array
  from /Users/John/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/net/http/generic_request.rb:179:in `send_request_with_body'

API呼び出しを構造化する他のさまざまな組み合わせを試しましたが、それを機能させる方法がわかりません。もう1つの例として、配列を本文の一部として使用せず、コンテンツを変換しますto_json

user = "gratitude_test"
api_key = "5962b93a-5bf7-4cb6-ae6f-aa4114c5e4f2"

HTTParty.post("https://www.gittip.com/#{user}/tips.json",
          {
            :body => { "amount" => "0.25", "platform" => "gittip", "username" => "whit537" }.to_json,
            :basic_auth => { :username => api_key },
            :headers => { 'Content-Type' => 'application/json' }
           })

これは以下を返します(500エラー):

<html>
  <head>
    <title>500 Internal Server Error</title>
  </head>
  <body>\n        Internal server error, program!\n        <pre></pre>  
  </body>
</html>

Curlにはあまり詳しくないので、HTTPartyに誤って変換しているかどうかはわかりません。

任意の助けいただければ幸いです。ありがとう。

14

推測ではありますが、JSONが期待されているときに、本文にハッシュを渡しているようです。

:body宣言を次のように置き換えてみてください:

:body => [{ "amount" => "0.25", 
             "platform" => "gittip", 
             "username" => "whit537" }].to_json

編集:to_jsonシリアライザーを提案しましたが、配列の代わりにハッシュの後に置き、配列を完全に削除することにより、誤った場所に置きました。この例では複数のレコードを使用しているため、配列が必要です。

this thread を見ると、GittipがAcceptヘッダーにこだわっているようです。

:headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}

したがって、完全な提案は次のとおりです。

HTTParty.post("https://www.gittip.com/#{user}/tips.json",
  { 
    :body => [ { "amount" => "0.25", "platform" => "gittip", "username" => "whit537" } ].to_json,
    :basic_auth => { :username => api_key },
    :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}
  })
31
d_ethier