2

Pythonでhttpリクエストを送信するPythonのコードがいくつかありますが、サーバーがRailsであるため、Rubyでそれを行う方法を理解しようとしています。

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.1Rubyバージョン1.9.2p318

4

1 に答える 1

4

アプリケーション/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 に答える