Получение HTTP 406 при вызове внешнего сайта из сервлета - PullRequest
1 голос
/ 19 мая 2011

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

/**
 * @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 ]

4 голосов
/ 19 мая 2011

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

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

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

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

3 голосов
/ 19 мая 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

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

0 голосов
/ 24 августа 2014

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

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

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

0 голосов
/ 19 мая 2011

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

...