簡體   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