2

我在 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

4

1 回答 1

4

尽管您调用远程服务器就好像它响应 application/x-www-form-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)
于 2012-05-01T23:48:32.453 回答