Вопрос по ruby, python, ruby-on-rails – urllib2 в python-эквиваленте для ruby

2

У меня есть некоторый код в Python, который отправляет запрос http в Python, но я пытаюсь выяснить, как сделать это в 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

Ваш Ответ

1   ответ
3

как будто он отвечает на данные 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)
Хорошее объяснение!

Похожие вопросы