Ruby Net / Http, как получить тело страницы с кодом статуса 3xx - PullRequest
0 голосов
/ 04 июля 2018

Я использую библиотеку net / http ruby ​​для получения html-ответа, но не могу получить тело страницы с кодом состояния 3xx

Тело страницы:

<div class="flash-container">
    <div class="flash flash-success">
        Il tuo indirizzo email è stato modificato con successo.
        <a href="#" onclick="removeFlash(this);" class="close">×</a>
    </div>
</div>

Запрос:

require 'net/http'
require 'uri'
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data({
      'email' => email,
      'email-confirm' => email_confirm,
      'password' => password
})
request['Cookie'] = 'ACCOUNT_SESSID=' + token
response = http.request(request)

Ответ:

response.code  # '302'
response.body # ''

1 Ответ

0 голосов
/ 04 июля 2018

Скорее всего, вам нужно будет следовать перенаправлению (302 код). Ruby docs имеет прекрасный пример для этого.

Я включил это ниже вместе с проверкой, чтобы вернуть тело, если оно существует. Если вы никогда не хотите следовать перенаправлению, вы можете изменить условие else, чтобы оно возвращало response.code, и пустую строку, false или любое другое подходящее значение. Вот полный пример:

def fetch(uri_str, limit = 10)
  raise ArgumentError, 'too many HTTP redirects' if limit == 0

  response = Net::HTTP.get_response(URI(uri_str))

  case response
  when Net::HTTPSuccess then
    response
  when Net::HTTPRedirection then
    if response.body_permitted?
      response
    else
      location = response['location']
      warn "redirected to #{location}"
      fetch(location, limit - 1)
    end
  else
    response.value
  end
end

Код довольно прост, рекурсивно вызывает себя, если код из Net::HTTP.get_response возвращает перенаправление, указывающее на новое местоположение.

При таком подходе вы можете выполнить до десяти переадресаций, которых должно быть достаточно, хотя, скорее всего, они должны соответствовать требованиям или обстоятельствам.

Затем, когда вы запускаете fetch(your_url), он должен следовать за перенаправлением, пока не попадет на страницу и не сможет вернуть тело. И.Е.

res = fetch(your_url)
res.body

Дайте мне знать, как вы справляетесь с этим, или если у вас есть какие-либо вопросы!

...