我在使用 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 请求。 Gittip API 描述了使用 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,第二个参数是选项散列。当我运行上面的代码时,出现以下错误:
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 调用的各种其他组合,但无法弄清楚如何让它发挥作用。这是另一个这样的例子,我没有使用数组作为正文的一部分并将内容转换为 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 header 很挑剔。
: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'}
})
关于ruby - 如何使用 HTTParty 实现此 POST 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19461333/