Сбой простого POST-запроса с em-http-запросом
Следующий запрос работает с http://www.requestmaker.com/:
URI:
http://www.cleverbot.com/webservicemin/
Запрос:
start=y&icognoid=wsf&fno=0&sub=Say&islearning=1&cleanslate=false&stimulus=!!!%20there%20was%20an%20error%20!!!&icognocheck=af71393ce00d9126a247df2f53948e79
Но это не работает с em-http-request
:
require 'eventmachine'
require 'em-http-request'
uri = 'http://www.cleverbot.com/webservicemin/'
query = 'start=y&icognoid=wsf&fno=0&sub=Say&islearning=1&cleanslate=false&stimulus=!!!%20there%20was%20an%20error%20!!!&icognocheck=af71393ce00d9126a247df2f53948e79'
EM.run do
http = EM::HttpRequest.new(uri).post(query: query)
http.callback { puts http.response; EM.stop }
http.errback { puts 'There was an error'; EM.stop }
end
который печатает There was an error
, Я чувствую себя озадаченным, потому что этот простой пример работает с любым другим методом отправки запроса, и я проверил, было ли мое использование неправильным, но это не так.
Изменить: просто для справки, это не правильный способ использования умного робота. Я сделал вторую ошибку, отправив данные под :query
, Если вы используете http.post(body: query)
это будет работать
1 ответ
Выглядит как плохо реализованный сервер: он прерывает соединение TCP без возврата правильного кода состояния HTTP, поэтому при запросе http.error вы видите "соединение закрыто сервером".
Если вы измените пользовательский агент по умолчанию на строку UA curl, вы получите ответ:
http = EM::HttpRequest.new(uri).post({
:query => query,
:head => {'User-Agent' => 'curl/7.30.0'}
})