Сбой простого 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'}
  })
Другие вопросы по тегам