2014-02-13 2 views
1

Я написал простой код для получения content-type данного URL-адреса. Для того, чтобы сделать обработку быстрее, я сделал изменения, чтобы установить метод запроса, как HEADТип ответа HTTP-ответа, отличный от 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. Если я запускаю тот же запрос HEAD, используя Poster или Postman, я вижу content-type как image/jpeg.

Так что же это делает изменение типа контента в случае этого Java-кода ?. Может ли кто-нибудь указать любую ошибку, которую я, возможно, сделал?

Примечание: Я использовал this пост в качестве ссылки

+0

Я предполагаю, что вы получили HTML-страницу, в которой говорится, что «метод не разрешен» или некоторая другая ошибка. Вероятно, вы должны добавить заголовок «Accept» и заголовок «User-Agent». – hgoebl

+0

@hgoebl хорошо, в этом случае, не должно ли оно «не быть» данным 'image/jpeg' при тестировании с помощью' poster/postman'? – Rakesh

+0

Я не уверен, сколько заголовков Postman добавляет ваш запрос, который явно не задан вами. Я полагаю, что «User-Agent» и «Accept» могут быть одним из них. Можете ли вы нюхать трафик (Fiddler, Wireshark)? – hgoebl

ответ

1

Вы, вероятно, следует добавить Accept заголовок и/или User-Agent заголовка.

Большинство веб-серверов предоставляют различное содержимое в зависимости от заголовков, установленных клиентом (например, веб-браузер, Java HttpURLConnection, curl, ...). Это особенно справедливо для Accept, Accept-Encoding, Accept-Language, User-Agent, Cookie и Referer.

В качестве примера веб-сервер может отказаться предоставить изображение, если заголовок Referer не ссылается на внутреннюю страницу. В вашем случае веб-сервер не доставляет изображения, если кажется, что какой-то робот сканирует его. Поэтому, если вы подделываете свой запрос, как будто он поступает из веб-браузера, сервер может его доставить.

При обходе веб-сайтов вы должны уважать robots.txt (потому что вы действуете как робот). Поэтому, строго говоря, вы должны быть осторожны при подделке User-Agent, когда делаете много запросов или создаете большой бизнес из этого. Я не знаю, как большие веб-сайты реагируют на такое поведение, особенно когда кто-то обходит там бизнес ...

Пожалуйста, не рассматривайте это как высказывание. Я просто хотел указать на это, чтобы вы не столкнулись с проблемами. Возможно, это не проблема, YMMV.

+0

Я просто тестировал с помощью пакета java.net. *. Просто из любопытства, когда я размещаю запрос 'HEAD', почему веб-сервер даже должен« думать »о доставке изображений. Разве 'HEAD' должен быть только для заголовков ?. Или, как вы говорите, «защищать» свои предприятия? – Rakesh

+0

Я думаю, что ты прав. Запросы HEAD не должны наносить никакого вреда. Но большинство реализаций динамического контента не имеют дополнительной логики для запросов HEAD, они просто не отправляют контент. На практике заголовок 'If-Modified-Since' (и тому подобное) используется чаще, чем запросы HEAD. Кстати, было бы очень интересно, как выглядел ответ, когда вы ожидали типа изображения и получили текст/html. – hgoebl

+0

Я просмотрел полный заголовок после вашей точки, что он может быть заблокирован для «автоматического сканирования».Infact, ответ был «403 запрещен», и это сообщение на самом деле «text/html». Теперь все имеет смысл, спасибо, что указали! – Rakesh

Смежные вопросы