Получение 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 в браузере дает правильный результат.

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

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

4 ответа

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

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

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

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

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

Как я уже говорил, я хотел связаться с Google Search, и мой 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

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

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

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

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

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

Другие вопросы по тегам