2014-02-13 81 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