Получение 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 должен быть там в ответе. Если нет, добавьте его в заголовок, если сервер находится под вашим контролем.