从Python转换后,如何在Ruby中通过HTTP发布JSON?

从Python转换后,如何在Ruby中通过HTTP发布JSON?,python,ruby,json,Python,Ruby,Json,我屈服了——我已经试了好几个小时来解决这个问题,但还是想不出来。我对Ruby太陌生了(而且没有Python背景!),无法翻译这个,然后将我的JSON数据发布到需要user/pass的站点,然后获取响应数据 这是Python代码: r = requests.post('https://keychain.oneid.com/validate/', json.dumps(data), auth=('username', 'password')) r.json() 其中,数据为: {"some" =&

我屈服了——我已经试了好几个小时来解决这个问题,但还是想不出来。我对Ruby太陌生了(而且没有Python背景!),无法翻译这个,然后将我的JSON数据发布到需要user/pass的站点,然后获取响应数据

这是Python代码:

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

{"some" => "data", "fun" => "times"}
我试图在Ruby中复制此代码的功能,以便与Rails应用程序一起使用,但在弄清楚Python
requests.post()
函数如何运行,然后为post和GET编写Ruby代码之间,我完全不知所措

我尝试了Net::HTTP,但我不清楚是应该将用户名/密码放在正文中还是使用
basic\u auth
方法--
basic\u auth
似乎只在
Net::HTTP.get
中起作用。。。HTTP似乎不容易处理JSON,但我现在可能要出去吃午饭了


如有任何建议或帮助,将不胜感激

我建议你去看看宝石。它使处理GET/POST以及所有其余的rest调用变得容易。它还有一个基于IRB的shell,名为
restclient
,可从命令行获得,这使您可以更轻松地试验连接设置

从文件中:

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使用了libcurl,这是用于web连接的行业标准工具。文档显示了发送POST请求的几种方法。

使用gem或只使用
Net::HTTP

Ruby代码(版本1.9.3):


两件事-1)JSON数据发送到哪里?2) 我只是用“rrno::ECONNRESET:connectionresetbypeer-SSL_connect”。。。有什么想法吗?1)添加JSON数据:req.body={:some=>'data',:fun=>'times'}。到_JSON 2)可能是OpenSSL的问题:非常感谢,工作起来很有魅力。如果其他人遇到OpenSSL问题,这个资源是最好的,解决了我的问题:@user2203324哦,是的!我的第一个答案是,我很高兴它有帮助。
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