HEAD请求上的HTTP响应内容类型不同

时间:2014-02-13 13:58:12

标签: java url httprequest content-type httpurlconnection

我编写了简单的代码来获取给定网址的content-type。为了加快处理速度,我进行了更改,将请求方法设置为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。如果我使用HEADPoster触发相同的Postman请求,我会将content-type视为image/jpeg

那么在这个Java代码的情况下,是什么让内容类型发生了变化?有人可以指出我可能犯的任何错误吗?

注意:我使用this帖子作为参考

1 个答案:

答案 0 :(得分:1)

您应该添加Accept标头和/或User-Agent标头。

大多数Web服务器根据客户端设置的标头提供不同的内容(例如Web浏览器,Java HttpURLConnection,curl,...)。对AcceptAccept-EncodingAccept-LanguageUser-AgentCookieReferer尤其如此。

例如,如果Referer标头未链接到内部页面,则Web服务器可能拒绝提供图像。 在您的情况下,如果某个机器人正在抓取它,则Web服务器不会传送图像。因此,如果您伪造您的请求,就好像它来自Web浏览器,服务器可能会提供它。

在抓取网站时,您应该尊重robots.txt(因为您的行为像机器人一样)。因此严格来说,在做大量请求时假装User-Agent时应该小心,或者创建一个大企业。我不知道有多大网站对这种行为做出反应,特别是当有人绕过那里做生意时......

请不要将此视为一个告密者。我只是想指出你,所以你不要遇到麻烦。也许这根本不是问题,YMMV。