【问题标题】:Getting HTTP 406 while calling external site from within servlet从 servlet 中调用外部站点时获取 HTTP 406
【发布时间】:2011-08-28 16:40:51
【问题描述】:

我的 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 会得到正确的结果。

我在这里错过了什么?

亲切的问候, 维尔纳

【问题讨论】:

  • HTTP 406 代表不可接受。您可以尝试将 XML 的接受标头添加到您的连接中吗? conn.setRequestProperty("Accept","text/xml")
  • 已经试过了。输出没有变化。仍然收到 406 错误。尝试了接受 wordt 的各种大写字母,因为我不知道这是否是问题所在。结果保持不变。

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


【解决方案1】:

我认为这与接受标头有关。你能检查一下交换的接受标头吗?

【讨论】:

  • 嗯。我会看看我是否可以得到一个工具来查看标题。
【解决方案2】:

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

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

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

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

【讨论】:

  • 它正在发回 XML。尝试了您的解决方案,但它不起作用。
【解决方案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' 即可解决问题。

【讨论】:

  • 正确。许多库和工具(如邮递员)在内部对 url 进行编码,以便它立即工作。但是有些库不对 URL 进行编码。因此,您可能必须找到一个库来对 URL 进行编码或手动进行。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多