1

我的 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

4 回答 4

4

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

您可以URLConnection使用该setRequestProperty(String, String)方法更改您请求的内容类型。您将不得不添加如下内容:

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

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

于 2011-05-19T08:47:16.197 回答
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' 解决了这个问题。

于 2011-05-19T17:58:34.833 回答
0

我认为这与接受标头有关。您可以检查交换的接受标头吗?

于 2011-05-19T08:46:35.077 回答
0

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

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

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

于 2014-08-24T12:59:11.993 回答