从servlet内部调用外部站点时获取HTTP 406

时间:2011-05-19 08:37:59

标签: java html servlets http-status-code-406

我的servlet中有以下代码:

/**
 * @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中运行此servlet会给我一个http 406错误。

我尝试做的是从我的servlet调用谷歌网站搜索,我想解析收到的(XML)结果。 (现在我只打印收到的结果)。 在浏览器中尝试使用url会得到正确的结果。

我在这里缺少什么?

亲切的问候, 沃纳

4 个答案:

答案 0 :(得分:4)

406 HTTP错误意味着服务器无法使用可接受的内容类型构建对您的请求的响应。这意味着您的URLConnection会询问服务器是否有给定的内容类型,并且服务器找不到合适的内容类型。

您可以使用setRequestProperty(String, String)方法更改URLConnection请求的内容类型。您必须添加以下内容:

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

(这假设服务器将XML发送给您)

答案 1 :(得分:3)

我解决了这个问题 我使用wireshark调查通过电线发送的内容 我的网址包含一个空格,这导致了所有问题。

如前所述,我想联系谷歌搜索,我的网址看起来像:

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'解决了这个问题。

答案 2 :(得分:0)

我认为它与Accept Headers有关。你能检查一下交换的接受标题。

答案 3 :(得分:0)

检查服务器的Content-Type响应标头。它应该返回:

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

charset = UTF-8应该在那里作为回应。如果服务器在您的控制范围内,如果没有将其添加到标题中。