6

我屈服了-我已经尝试了几个小时来破解这个坚果,但无法弄清楚。我对 Ruby 太陌生(并且没有 Python 背景!)无法翻译这个然后将我的 JSON 数据发布到需要用户/通行证的站点,然后获取响应数据。

这是 Python 代码:

r = requests.post('https://keychain.oneid.com/validate/', json.dumps(data), auth=('username', 'password'))
r.json()

哪里data是:

{"some" => "data", "fun" => "times"}

我试图在 Ruby 中复制此代码的功能,以便与 Rails 应用程序一起使用,但是在弄清楚 Pythonrequests.post()函数如何运行以及为 POST 和 GET 编写 Ruby 代码之间,我完全迷失了方向。

我尝试了 Net::HTTP 但我不清楚是否应该将用户名/密码放在正文中或使用该basic_auth方法 -basic_auth似乎只能在内部工作Net::HTTP.get......而且 Net::HTTP 似乎不容易处理JSON,但同样,我现在完全可以出去吃午饭了。

任何建议或帮助将不胜感激!

4

2 回答 2

16

使用rest-client gem 或只使用Net::HTTP.

Ruby 代码(版本 1.9.3):

require 'net/http'
require 'json'
require 'uri'

uri = URI('https://keychain.oneid.com/validate/')
req = Net::HTTP::Post.new uri.path
# ruby 2.0: req = Net::HTTP::Post.new uri
req.basic_auth 'username', 'password'
req.body = {:some => 'data', :fun => 'times'}.to_json

res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  http.ssl_version = :SSLv3
  http.request req
end

puts res.body
# => {"errorcode": -99, "error": "Invalid API credentials. Please verify and try again"}

json = JSON.parse res.body
puts json['errorcode']
# => -99
于 2013-05-10T05:07:51.077 回答
3

我建议看一下RestClient gem。它使处理 GET/POST 以及所有其余的 REST 调用变得容易。它还具有restclient可从命令行调用的基于 IRB 的 shell,使您可以更轻松地尝试连接设置。

从文档中:

RestClient.post "http://example.com/resource", { 'x' => 1 }.to_json, :content_type => :json, :accept => :json

查看它,您可以看到与 Python 代码的相似之处。

您可以将身份验证信息添加到哈希中:

require 'restclient'
require 'json'
require 'base64'

RestClient.post(
  'https://keychain.oneid.com/validate/',
  {
    :authentication => 'Basic ' + Base64.encode64(name + ':' + password),
    'some' => 'data',
    'fun' => 'times'
  }.to_json,
  :content_type => :json,
  :accept => :json
)

或者,您可以使用Curb gem。Curb 使用了 libcurl,这是一个用于 Web 连接的行业标准工具。该文档显示了几种发送 POST 请求的方法。

于 2013-05-10T04:21:10.157 回答