簡體   English   中英

為什么Ruby Net :: HTTP.get_response和Net :: HTTP.new(uri.host).request返回不同的內容?

[英]Why do Ruby Net::HTTP.get_response and Net::HTTP.new(uri.host).request return different things?

這兩個請求應該具有相同的結果,但是第一個請求返回200(確定),第二個請求返回404(未找到)。 這是為什么?

require 'net/http'

url = "http://readwrite.com/2013/12/04/google-compute-engine"
uri = URI(url)
Net::HTTP.get_response(uri)
#=> #<Net::HTTPOK 200 OK readbody=true>
Net::HTTP.new(uri.host).request(Net::HTTP::Get.new(url))
#=> #<Net::HTTPNotFound 404 Not Found readbody=true>

它僅在某些網址下發生。 我不知道這種模式。 這是另一個示例: http://davidduchemin.com/2014/01/towards-mastery-again/ : http://davidduchemin.com/2014/01/towards-mastery-again/

首先,讓我們通過使用tcpdump查看它們的實際HTTP請求來比較兩者,以便我們可以了解可能發生的情況:

tcpdump -vvASs 0 port 80 and host www.readwrite.com
# Net::HTTP.get_response(uri)

GET /2013/12/04/google-compute-engine HTTP/1.1
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
User-Agent: Ruby
Host: readwrite.com
# Net::HTTP.new(uri.host).request(Net::HTTP::Get.new(url))

GET http://readwrite.com/2013/12/04/google-compute-engine HTTP/1.1
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
User-Agent: Ruby
Connection: close
Host: readwrite.com

我們可以看到第二個請求錯誤地請求了完整的URL(帶有主機名)作為路徑。 這是因為您將url傳遞到Net::HTTP::Get.new ,這導致Net::HTTP::Get.new(url).path就是我們上面看到的:帶有主機名的完整URL。 而是將URI實例( uri )傳遞給Net::HTTP::Get.new

Net::HTTP.new(uri.host).request(Net::HTTP::Get.new(uri))
#=> #<Net::HTTPOK 200 OK readbody=true>

現在,它的tcpdump實際上與第一個相同:

GET /2013/12/04/google-compute-engine HTTP/1.1
Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept: */*
User-Agent: Ruby
Host: readwrite.com
Connection: close

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM