urthon中的urllib2相当于ruby

时间:2012-05-01 23:22:03

标签: python ruby-on-rails ruby

我在python中有一些代码在python中发送一个http请求,但是我试图弄清楚如何在ruby中执行它,因为我的服务器是rails。

import urllib2, sys, json

url = "http://new.openbms.org/backend/api/query"
query = "select *"
fp = urllib2.urlopen(url, data=query)
obj = json.load(fp)
json.dump(obj, sys.stdout, sort_keys=True, indent=2)

这个python代码实际上确实返回了我的期望,但是当我在ruby中尝试同样的事情时,我得到了一个错误的请求

require 'net/http'

query = "select *"
url = "http://new.openbms.org/backend/api/query"
uri = URI(url)
p Net::HTTP.post_form(uri, { "data" => query })

以上打印出#<Net::HTTPBadRequest 400 Bad Request readbody=true>。请帮助,谢谢。

Python版本2.7.1 Ruby版本1.9.2p318

1 个答案:

答案 0 :(得分:3)

虽然您正在调用远程服务器,就好像它响应了application / x-www-form-urlencoded数据一样,实际上它只是响应帖子正文中的命令。

在Python中,urllib2.urlopen的数据参数需要一个&#39; s application/x-www-form-urlencoded的字符串。

select *实际上并非真正编码,但无论如何它都适合您,因为服务器将其解释为名为select *的查询参数,其中None 1}}值,或者更确切地说,服务器看到一个帖子正文select *并说&#34;我知道如何回应该命令&#34;。

所以,Ruby就相当于你正在做的事情。

require 'net/http'
require 'json'

query = "select *"
url = "http://new.openbms.org/backend/api/query"
uri = URI(url)
response = Net::HTTP.post_form(uri, { query => nil })
puts JSON.parse(response.body)