从Python转换后,如何在Ruby中通过HTTP发布JSON?
我屈服了——我已经试了好几个小时来解决这个问题,但还是想不出来。我对Ruby太陌生了(而且没有Python背景!),无法翻译这个,然后将我的JSON数据发布到需要user/pass的站点,然后获取响应数据 这是Python代码:从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" =&
r = requests.post('https://keychain.oneid.com/validate/', json.dumps(data), auth=('username', 'password'))
r.json()
其中,数据
为:
{"some" => "data", "fun" => "times"}
我试图在Ruby中复制此代码的功能,以便与Rails应用程序一起使用,但在弄清楚Pythonrequests.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