【问题标题】:HTTP Response content type different on HEAD requestHEAD 请求上的 HTTP 响应内容类型不同
【发布时间】:2014-03-12 10:52:33
【问题描述】:

我编写了简单的代码来获取给定 URL 的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。如果我使用PosterPostman 触发相同的HEAD 请求,我会将content-type 视为image/jpeg

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

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

【问题讨论】:

  • 我想你得到一个 HTML 页面,上面写着“方法不允许”或其他一些错误。您可能应该添加一个“Accept”标头和“User-Agent”标头。
  • @hgoebl 好吧,在这种情况下,当使用poster/postman 进行测试时,它不应该有not 给定image/jpeg 吗?
  • 我不确定 Postman 向您的请求添加了多少您未明确设置的标头。我想“用户代理”和“接受”可能是其中之一。你能嗅出流量吗(Fiddler、Wireshark)?
  • @hgoebl 非常感谢,在请求标头中添加 User-Agent 属性解决了这个问题。您能否将其添加为答案,以便我接受!。

标签: java url httprequest content-type httpurlconnection


【解决方案1】:

您可能应该添加一个Accept 标头和/或User-Agent 标头。

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

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

在抓取网站时,您应该尊重robots.txt(因为您的行为就像一个机器人)。所以严格来说,在做大量请求或以此创造大生意时,假装User-Agent 时应该小心。我不知道大型网站对这种行为有何反应,尤其是当有人绕过那里的业务时......

请不要将此视为告发。我只是想向你指出这一点,这样你就不会遇到麻烦。也许这根本不是问题,YMMV。

【讨论】:

  • 我只是在测试 java.net.* 包。只是出于好奇,当我提出HEAD 请求时,为什么网络服务器甚至必须“考虑”传送图像。 HEAD 不应该只用于标题吗?还是如您所说,“保护”其业务?
  • 我认为你是对的。 HEAD 请求不应该造成任何伤害。但是大多数动态内容的实现没有针对 HEAD 请求的额外逻辑,它们只是不发送内容。在实践中,If-Modified-Since 标头(等​​)比 HEAD 请求更频繁地使用。顺便说一句,当您期望图像类型并获得 text/html 时,响应的样子会非常有趣。
  • 在您指出它可能因automated crawling 而被阻止之后,我确实查看了完整的标题。事实上,回复是403 forbidden,而这条消息实际上是text/html。现在一切都说得通了,感谢您指出!
  • 此外,通过代码请求的用户代理是User-Agent : Java/1.7.0_51
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多