2011-05-19 47 views
1

內調用外部網站我已經在我的servlet下面的代碼:獲取HTTP 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); 
    } 
} 

運行這個servlet在Tomcat中給了我一個HTTP 406錯誤。

我試圖做的是從我的servlet調用谷歌網站搜索,我想解析接收到的(XML)結果。 (現在我只是打印收到的結果)。 嘗試在瀏覽器中的網址是給出正確的結果。

我在這裏錯過了什麼?

親切的問候, 沃納

+1

HTTP 406代表不可接受。你可以嘗試在你的連接上添加XML的accept頭文件嗎? conn.setRequestProperty(「Accept」,「text/xml」) – Jacob 2011-05-19 08:45:11

+0

已經試過了。輸出沒有變化。仍然收到406錯誤。嘗試了不同的大寫字母接受,因爲我不知道這可能是問題。結果保持不變。 – 2011-05-19 11:00:41

回答

0

我認爲這與接受頭做。你可以檢查交換的accept-headers。

+0

嗯。我會看看我是否可以用手來查看標題。 – 2011-05-19 11:02:59

+1

嘗試[Wireshark](http://www.wireshark.org/) – Jacob 2011-05-19 11:35:12

3

406 HTTP錯誤意味着服務器無法用可接受的內容類型構建對您的請求的響應。這意味着您的URLConnection要求服務器提供給定的內容類型,並且服務器找不到合適的內容類型。

您可以使用setRequestProperty(String, String)方法更改URLConnection請求的內容類型。你將不得不添加類似:

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

(這個假設的服務器發送XML回給你)

+0

它正在發回XML。試過你的解決方案,但它不起作用。 – 2011-05-19 11:04:58

3

我解決了這個問題。
我使用wireshark來調查通過電線發送的內容。
我的網址包含一個空間,並導致所有問題。

像以前一樣,我想聯繫谷歌搜索,我的URL看起來是這樣說:

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 

這是ofcourse不正確的。它應該都是一個名爲「請求URI」的字段。
將空間更改爲'%20'解決了問題。

+0

現貨。許多庫和工具(如郵遞員)在內部對網址進行編碼,因此,它就像馬上就可以工作。但有些庫不會編碼URL。因此,您可能必須找到一個庫來編碼URL或手動執行。 – madhairsilence 2016-12-21 07:32:32

0

檢查服務器的內容類型響應標題。它應該返回:

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

charset = UTF-8應該在那裏作爲迴應。如果服務器不在您的控制範圍內,請將其添加到標題中。