Получение HTTP 406 при вызове внешнего сайта из сервлета

У меня есть следующий код в моем сервлете:

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
public void doIt(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    URL url = new URL("http://some.url.that.works.well.nl/q=hello&ie=nl&cx=hdyehgfyegywjehdkwed:7364du7");

    URLConnection conn = url.openConnection();
    conn.connect();

    BufferedReader br = new BufferedReader(
        new InputStreamReader(conn.getInputStream()));  // This line is generating the error
    String line = "";
    PrintWriter pw = response.getWriter();
    while((line = br.readLine()) != null) {
        pw.println(line);
    } 
}

запуск этого сервлета в tomcat дает мне ошибку http 406.

То, что я пытаюсь сделать, это изнутри моего сервлета, вызывающего поиск по сайту Google, и я хотел бы проанализировать полученный (XML) результат. (Пока я просто печатаю полученный результат). Попытка URL-адреса в браузере дает правильный результат.

Что мне здесь не хватает?

С уважением, Вернер


person Werner van Mook    schedule 19.05.2011    source источник
comment
HTTP 406 означает неприемлемо. Не могли бы вы попробовать добавить заголовок accept для XML к вашему соединению? conn.setRequestProperty(Принять,текст/xml)   -  person Jacob    schedule 19.05.2011
comment
Пробовал это уже. На выходе никаких изменений. Все еще получаю ошибку 406. пробовал разные варианты использования слова с заглавной буквы, поскольку я не знаю, может ли это быть проблемой. Результат остается прежним.   -  person Werner van Mook    schedule 19.05.2011


Ответы (4)


Ошибка HTTP 406 означает, что сервер не смог создать ответ на ваш запрос с допустимым типом контента. Это означает, что ваш URLConnection запрашивает у сервера данный тип контента, а сервер не может найти подходящий.

Вы можете изменить тип содержимого, запрошенный вашим URLConnection, с помощью setRequestProperty(String, String). Вам нужно будет добавить что-то вроде:

conn.setRequestProperty("accept", "text/xml");

(Это предполагает, что сервер отправляет вам XML обратно)

person Vivien Barousse    schedule 19.05.2011
comment
Он отправляет обратно XML. Попробовал ваше решение, но оно не работает. - person Werner van Mook; 19.05.2011

Я решил проблему.
Я использовал wireshark, чтобы выяснить, что было отправлено по сети.
Мой URL содержал пробел, и это вызывало все проблемы.

Как уже говорилось ранее, я хотел связаться с поиском Google, и мой URL-адрес выглядел примерно так:

http://www.google.com/search?q=golden handpressure&ie=8758438&cx=hjfweufhweufwef:9e

это работает в адресной строке браузера, но не в java.

С помощью wireshark я обнаружил, что заголовок моего запроса содержит:

Request URI: http://www.google.com/search?q=golden
Request version: handpressure&ie=8758438&cx=hjfweufhweufwef:9e

Это конечно не правильно. все это должно быть одним полем под названием «URI запроса».
Замена пробела на «%20» решила проблему.

person Werner van Mook    schedule 19.05.2011
comment
Точно. Многие библиотеки и инструменты (например, почтальон) кодируют URL-адрес внутри, так что он работает сразу. Но некоторые библиотеки не кодируют URL. Поэтому либо вам, возможно, придется найти библиотеку для кодирования URL-адресов, либо сделать это вручную. - person madhairsilence; 21.12.2016

Я думаю, что это связано с Accept Headers. Можете ли вы проверить обмен заголовками accept.

person Suraj Chandran    schedule 19.05.2011
comment
Хм. Я посмотрю, смогу ли я получить инструмент для просмотра заголовков. - person Werner van Mook; 19.05.2011

Проверьте сервер на наличие заголовка ответа Content-Type. Он должен вернуться:

Content-Type:text/xml; charset=UTF-8

charset=UTF-8 должен быть в ответе. Если нет, добавьте его в заголовок, если сервер находится под вашим контролем.

person Sandeep Kumar    schedule 24.08.2014