如何使用 HTTParty 实现这个 POST 请求? [英] How can I implement this POST request using HTTParty?

查看:20
本文介绍了如何使用 HTTParty 实现这个 POST 请求?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法使用 Ruby 的 HTTParty 库向 API 端点发出 POST 请求.我正在与之交互的 API 是 Gittip API,它们的端点需要身份验证.我已经能够使用 HTTParty 成功发出经过身份验证的 GET 请求.

您可以在示例代码中看到:

user = "gratitude_test"api_key = "5962b93a-5bf7-4cb6-ae6f-aa4114c5e4f2"# 我已经包含了真实的凭据,因为以上只是一个测试帐户.HTTParty.get("https://www.gittip.com/#{user}/tips.json",{ :basic_auth =>{:用户名=>api_key } })

该请求有效并按预期返回以下内容:

<预><代码>[{金额"=>"1.00",平台" =>"gittip",用户名" =>whit537"},{金额"=>"0.25",平台" =>"gittip",用户名" =>约翰凯利弗格森"}]

但是,我一直无法使用 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"内容类型:应用程序/json"

我已经尝试(未成功)使用 HTTParty 构建我的代码,如下所示:

user = "gratitude_test"api_key = "5962b93a-5bf7-4cb6-ae6f-aa4114c5e4f2"HTTParty.post("https://www.gittip.com/#{user}/tips.json",{:body =>[ { 金额" =>0.25",平台"=>"gittip", "用户名" =>whit537"}],:basic_auth =>{:用户名=>api_key },:headers =>{ '内容类型' =>'应用程序/json' }})

第一个参数是 url,第二个参数是选项哈希.当我运行上面的代码时,出现以下错误:

NoMethodError: 未定义方法 `bytesize' for [{"amount"=>"0.25", "platform"=>"gittip", "username"=>"whit537"}]:Array来自/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 =>{金额"=>0.25",平台"=>"gittip", "用户名" =>"whit537" }.to_json,:basic_auth =>{:用户名=>api_key },:headers =>{ '内容类型' =>'应用程序/json' }})

返回以下内容(500 错误):

<头><title>500 内部服务器错误</title><body>
 内部服务器错误,程序!
 <pre></pre>

我对 curl 不是很熟悉,所以我不确定我是否错误地将内容转换为 HTTParty.

任何帮助将不胜感激.谢谢.

解决方案

只是猜测,但看起来您在需要 JSON 时在正文中传递了一个哈希值.

尝试将 :body 声明替换为:

:body =>[{金额"=>"0.25",平台" =>"gittip",用户名" =>whit537"}].to_json

我建议使用 to_json 序列化程序,但把它放在散列之后而不是数组之后并完全删除数组,从而错误地放置了它.该示例使用多条记录,因此数组是必需的.

查看这个线程后,它看起来像Gittip 对接受标头很挑剔.

:headers =>{ '内容类型' =>'应用程序/json', '接受' =>'应用程序/json'}

所以,完整的建议是:

HTTParty.post("https://www.gittip.com/#{user}/tips.json",{:body =>[ { 金额" =>0.25",平台"=>"gittip", "用户名" =>whit537"}].to_json,:basic_auth =>{:用户名=>api_key },:headers =>{ '内容类型' =>'应用程序/json', '接受' =>'应用程序/json'}})

I am having difficulty making a POST request to an API endpoint using Ruby's HTTParty library. The API I'm interacting with is the Gittip API and their endpoint requires authentication. I have been able to successfully make an authenticated GET request using HTTParty.

You can see in the example code:

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 } })

That request works and returns the following as expected:

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

However, I have been unable to make a successful POST request using HTTParty. The Gittip API describes making a POST request using curl as follows:

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"

I have tried (unsuccessfully) structuring my code using HTTParty as follows:

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' }
               })

The first argument is the url and the second argument is an options hash. When I run the code above, I get the following error:

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'

I have tried various other combinations of structuring the API call, but can't figure out how to get it to work. Here's another such example, where I do not user an array as part of the body and convert the contents 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' }
           })

Which returns the following (a 500 error):

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

I'm not really familiar with curl, so I'm not sure if I am incorrectly translating things to HTTParty.

Any help would be appreciated. Thanks.

解决方案

Just a guess, but it looks like you're passing a hash in the body when JSON is expected.

Try replacing the :body declaration with:

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

Edit: I suggested the to_json serializer, but misplaced it by putting it after the hash instead of the array and removing the array altogether. The example uses multiple records, so the array is necessary.

After looking at this thread, it looks like Gittip is picky about the accept header.

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

So, the full suggestion is:

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'}
  })

这篇关于如何使用 HTTParty 实现这个 POST 请求?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆