我编写了简单的代码来获取给定 URL 的内容类型
。为了使处理速度更快,我进行了更改,将请求方法设置为 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
。如果我使用 Poster
或 Postman
触发相同的 HEAD
请求,我会看到 content-type
为 image/jpeg
。
那么在这段 Java 代码中,是什么导致内容类型发生变化呢?有人可以指出我可能犯的任何错误吗?
注意:我使用了 this发帖作为引用
最佳答案
您可能应该添加一个 Accept
header 和/或 User-Agent
header 。
大多数 Web 服务器根据客户端设置的 header (例如 Web 浏览器、Java HttpURLConnection、curl 等)提供不同的内容。对于 Accept
、Accept-Encoding
、Accept-Language
、User-Agent
、Cookie
和 Referer
来说尤其如此。
例如,如果 Referer
header 未链接到内部页面,网络服务器可能会拒绝传送图像。
在您的情况下,如果网络服务器看起来像是某个机器人正在抓取图像,则它不会提供图像。因此,如果您伪造请求(例如来自网络浏览器),服务器可能会传送该请求。
在抓取网站时,您应该尊重 robots.txt
(因为您的行为就像一个机器人)。因此严格来说,在执行大量请求或由此创建大业务时伪造 User-Agent
时,您应该小心。我不知道大型网站对这种行为有何 react ,尤其是当有人绕过那里的业务时......
请不要将此视为责备。我只是想向您指出这一点,这样您就不会遇到麻烦。也许这根本不是问题,YMMV。
关于java - HEAD 请求上的 HTTP 响应内容类型不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756303/