2012-10-02 24 views
4

我使用下面的代碼從Web服務器請求XML:ClientProtocolException在httpClient.execute(HTTPGET,ResponseHandler所)

HttpClient httpclient = new DefaultHttpClient() 
try 
{ 
    HttpGet httpget = new HttpGet("http://63.255.173.242/get_public_tbl.cgi?A=1");    
    ResponseHandler responseHandler = new BasicResponseHandler(); 
    String responseBody = httpclient.execute(httpget, responseHandler); 
    System.out.println(responseBody); 
} 
catch (ClientProtocolException e) 
{ 
    e.printStackTrace(); 
} 
catch (IOException e) 
{ 
    e.printStackTrace(); 
} 
finally 
{ 
    httpclient.getConnectionManager().shutdown(); 
} 
 

我得到一個clientProtocolException當我打電話httpclient.execute(HTTPGET,ResponseHandler所)。該網址在Web瀏覽器中工作得很好,它返回XML並且瀏覽器顯示它。

任何想法,爲什麼我會得到一個clientProtocolException,但瀏覽器處理它就好了?

編輯1:

尋找在協議異常的詳細消息是:「服務器無法以有效的HTTP響應來響應」。我無法更改我打的網絡服務器。有沒有辦法忽略這一點,只是訪問響應?

編輯2:

我發現服務器沒有發回完整的標頭。即使返回了損壞的標題,是否有辦法訪問響應的內容?

編輯3:我編輯的IP地址是我打的真正的IP地址。任何幫助將非常感激。

+0

解決方案是什麼。我遇到了同樣的問題 –

回答

5

當你的代碼似乎是正確的,你必須弄清楚:這是客戶端的錯誤(無效請求)還是服務器的錯誤(無效響應)。爲此,請使用http trace utitlity,並將瀏覽器的請求與客戶端的請求進行比較。如果有的話,你也可以看到服務器的原始響應。如果您無法弄清楚,請將原始請求和回覆添加到您的問題中,並且有人可能會提供幫助。

+0

我知道服務器沒有發送回有效的響應,因爲頭不完整。但服務器無法更改。這是我正在實現功能的第三方服務器。無論如何,我知道必須有一種方法可以訪問原始響應,並對我想要的數據進行分類。我發佈的是我的要求。有沒有更好的辦法? –

+2

我發現服務器根本沒有發送頭文件。最好的解決方案是直接與套接字通信。 –

+0

@Kevin你最終做了什麼這個問題,我得到同樣的問題? –

2

我已經用我的ip地址測試過你的代碼。代碼中沒有錯誤。我只是將ResponseHandler更改爲BasicResponseHandler

檢查這個

HttpClient httpclient = new DefaultHttpClient(); 
    try 
    { 
     HttpGet httpget = new HttpGet("http://www.MyServer.com/get_public_tbl.cgi?A=1");    
     BasicResponseHandler responseHandler = new BasicResponseHandler();//Here is the change 
     String responseBody = httpclient.execute(httpget, responseHandler); 
     System.out.println(responseBody); 
    } 
    catch (ClientProtocolException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     httpclient.getConnectionManager().shutdown(); 
    } 
+0

這對我的代碼來說是一個很好的改進,但沒有解決問題。 –

2

你可以嘗試添加自己的響應攔截器,在這裏你可以添加或刪除頭,或者打印一些調試信息

hc.addResponseInterceptor(new HttpResponseInterceptor() { 
    @Override 
    public void process(HttpResponse response, HttpContext context) throws HttpException, IOException { 
     response.getEntity().writeTo(System.out); 
    } 
}); 
+0

我添加了一個響應攔截器,但在拋出協議異常之前,該進程方法不會被調用。如果我點擊一個發送有效頭的服務器,則會調用該過程方法。任何其他想法? –

+0

U可以用同樣的方法用'void process(HttpRequest request,HttpContext context)'方法添加'new HttpRequestInterceptor',然後打印並比較從瀏覽器和ur代碼發出的請求頭。可能是服務器W8「接受編碼」,「gzip」頭或其他 – lanwen

1

檢查您在客戶端設置的標題,重新驗證標題的鍵和值。在我的情況下,我使用「csrf」參數而不是「Cookie」。

相關問題