繁体   English   中英

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

[英]Getting HTTP 406 while calling external site from within servlet

我的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调用Google网站搜索中进行的,我想解析接收到的(XML)结果。 (目前,我只打印接收到的结果)。 在浏览器中尝试该URL可以给出正确的结果。

我在这里想念什么?

亲切的问候,沃纳

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

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

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

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

我解决了问题。
我用wireshark研究了通过电线发送的内容。
我的网址包含一个空格,这引起了所有问题。

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

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

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

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

charset = UTF-8应该在响应中。 如果没有,则将其添加到标头中(如果服务器在您的控制范围内)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM