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

标签 java url httprequest content-type httpurlconnection

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

那么在这段 Java 代码中,是什么导致内容类型发生变化呢?有人可以指出我可能犯的任何错误吗?

注意:我使用了 this发帖作为引用

最佳答案

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

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

例如,如果 Referer header 未链接到内部页面,网络服务器可能会拒绝传送图像。 在您的情况下,如果网络服务器看起来像是某个机器人正在抓取图像,则它不会提供图像。因此,如果您伪造请求(例如来自网络浏览器),服务器可能会传送该请求。

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

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

关于java - HEAD 请求上的 HTTP 响应内容类型不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756303/

相关文章:

java - 带有 Spring MVC 的 JSP - ${} 变量未显示

java - Spring MVC 导致错误的操作

url - 如果查询参数不可用,则出现 Mule-Throw 错误

url - 网址中的 www 有什么意义?

java - java中如何从请求中获取ip?

java - gc方法如何工作?

java - 如何为循环中创建的 100 个文本字段创建一个changeListener?

php - 如何替换文本 URL 并排除 HTML 标记中的 URL?

java - Spring org.springframework.web.multipart.support.MissingServletRequestPartException,所需的请求部分 'file' 不存在

java - 限制 iOS 和 Android 的入站流量