Ruby Net / Http如何获取状态码为3xx的页面主体

时间:2018-07-04 15:47:13

标签: ruby request net-http

我使用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 :(得分:0)

您可能需要遵循重定向(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)时,它应该遵循重定向,直到其到达页面并可以返回正文为止。 I.E。

res = fetch(your_url)
res.body

如果您有任何疑问,请告诉我!