我使用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 # ''
答案 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
如果您有任何疑问,请告诉我!