2012-05-01 96 views
2

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

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代码实际上并返回我的期望,但是当我尝试同样的事情在我的红宝石得到一个坏的请求

require 'net/http' 

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

这一块上面打印输出​​。请帮忙,谢谢。

Python版本2.7.1 的Ruby版本1.9.2p318

回答

3

虽然你调用远程服务器,如果它以应用程序响应/ X WWW的形式,进行了urlencoded的数据,其实它只是在响应命令在帖子正文中。

在Python中,urllib2.urlopen的数据参数需要一个字符串,它是application/x-www-form-urlencoded

select *没有真正形成编码可以这么说,但它无论如何为你工作,因为服务器将其解释为一个名为select *None值,或者更准确的查询参数,服务器看到一个帖子体select *并说“我知道如何回应这个命令”。

因此,与你正在做的事情相当的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) 
+0

很好的解释! –