我在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
答案 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)