2014-02-13 82 views
1

我編寫了簡單的代碼來獲取給定URL的content-type。爲了使處理速度更快,我進行了更改設置請求方法HEADHTTP響應內容類型與HEAD請求不同

// Added a random puppy face picture here 
// On entering this query in browser (or Poster<mozilla> or Postman<chrome>), the 
// content type is shown as image/jpeg 

URL url = new URL("http://www.bubblews.com/assets/images/news/521013543_1385596410.jpg");  

HttpURLConnection connection = (HttpURLConnection) url 
     .openConnection(); 
connection.setRequestMethod("HEAD"); 
connection.connect(); 
String contentType = connection.getContentType(); 
System.out.println(contentType); 
if (!contentType.contains("text/html")) { 
    System.out.println("NOT TEXT/HTML"); 
    // Do something 
} 

我想實現的東西,如果它不是text/html,但是當我設置請求方法HEAD,內容類型顯示爲text/html。如果我使用PosterPostman發出相同HEAD請求,我會將content-type視爲image/jpeg

那麼,在這個Java代碼的情況下,什麼是內容類型的變化?有人可以指出我可能犯的任何錯誤嗎?

注:我以前this崗位作爲參考

+0

我想你會得到一個說明「方法不允許」或其他錯誤的HTML頁面。您應該添加一個「Accept」標頭和「User-Agent」標頭。 – hgoebl

+0

@hgoebl那麼,在這種情況下,使用'poster/postman'進行測試時,它是否不應該具有'image/jpeg'? – Rakesh

+0

我不確定Postman添加到您的請求中的郵件數量是否由您明確設置。我想'用戶代理'和'接受'可能就是其中之一。你可以嗅探交通(Fiddler,Wireshark)嗎? – hgoebl

回答

1

很可能需要添加一個Accept頭和/或User-Agent頭。

大多數Web服務器根據客戶端設置的標頭(例如,Web瀏覽器,Java HttpURLConnection,curl,...)提供不同的內容。這對於Accept,Accept-Encoding,Accept-Language,User-Agent,CookieReferer尤其如此。

作爲示例,如果Referer標頭沒有鏈接到內部頁面,則Web服務器可能會拒絕傳送圖像。 就你而言,如果網絡服務器看起來像是某個機器人抓取它,那麼它不會傳送圖像。因此,如果您假設您的請求來自網絡瀏覽器,服務器可能會提供該請求。

抓取網站時,您應該尊重robots.txt(因爲您的行爲像機器人)。所以嚴格來說,在做大量請求時僞造User-Agent或者創建大型業務時應該小心。我不知道有多大的網站會對此類行爲做出反應,特別是當有人繞過那裏的業務時...

請不要將此視爲告知。我只是想告訴你,所以你不會遇到麻煩。也許這根本不是問題,YMMV。

+0

我只是用java.net。*包進行測試。出於好奇,當我提出「HEAD」請求時,爲什麼網絡服務器甚至必須「思考」提供圖像。不是'頭'應該只用於標題?或者,正如你所說,它是'保護'其業務? – Rakesh

+0

我認爲你是對的。 HEAD請求不應該造成任何傷害。但是動態內容的大多數實現沒有額外的HEAD請求邏輯,他們只是不發送內容。在實踐中,「If-Modified-Since」頭(等等)比HEAD請求更頻繁地使用。順便說一句,當你期望一個圖像類型和獲得文本/ html時,響應看起來會非常有趣。 – hgoebl

+0

在您指出它可能被阻止用於「自動抓取」之後,我確實查看了完整的標題。事實上,響應是'403禁止',這個消息實際上是'text/html'。這一切都有道理,謝謝指出! – Rakesh