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に誤って変換しているかどうかはわかりません。
任意の助けいただければ幸いです。ありがとう。
推測ではありますが、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'}
})