2012-05-01 3 views
2

У меня есть код в python, который отправляет HTTP-запрос в python, но я пытаюсь выяснить, как это сделать в ruby, так как мой сервер - рельсы.urllib2 в эквиваленте python для 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) 

код Этот питон на самом деле вернуть то, что я ожидал, но когда я пытаюсь то же самое в рубин я плохой запрос

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 рубин версия 1.9.2p318

ответ

3

Хотя вы вызываете удаленный сервер, как если бы он реагирует на данные приложения/х-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

Хорошее объяснение! –