2016-11-08 35 views
1

我不明白爲什麼我的代碼在讀取Http Response實體時給了我垃圾數據。只有當我發出一個請求到一個具有400個響應的數據的特定URL時,纔會發生這種情況。我的代碼嘗試讀取響應實體,但正如您在下面看到的,它是垃圾。Jersey Client爲什麼給出垃圾數據?

這裏是一個簡化的測試案例:

import org.junit.Test; 

import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.Invocation; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.Response; 
import java.util.List; 
import java.util.Map; 

public class Sandbox { 
    @Test 
    public void jaguarTestCase() { 
     Client client = ClientBuilder.newClient(); 

     WebTarget target = client.target("http://www.jaguarusa.com/owners/vin-recall.html?view=vinRecallQuery&vin=xxxxxxxxxxxxxxxxx"); 
     Invocation.Builder builder = target.request(); 
     Response response = builder.get(Response.class); 

     System.out.println("Response Code:"); 
     System.out.println("\t" + response.getStatus() + " - " + response.getStatusInfo().getReasonPhrase()); 

     System.out.println("\nResponse Headers:"); 
     for (Map.Entry<String, List<String>> entry : response.getStringHeaders().entrySet()) { 
      System.out.print("\t" + entry.getKey() + ": "); 
      for (String value : entry.getValue()) { 
       System.out.println(value); 
      } 
     } 

     String responseEntity = response.readEntity(String.class); 
     System.out.println("\nResponse Entity: "); 
     System.out.println(responseEntity); 
    } 
} 

,並從測試用例輸出:

Response Code: 
    400 - Bad Request 

Response Headers: 
    X-Frame-Options: SAMEORIGIN 
    Cache-Control: no-cache, no-store, must-revalidate 
    Server: Apache-Coyote/1.1 
    Connection: keep-alive 
    Content-Encoding: gzip 
    Vary: Accept-Encoding 
    Content-Length: 135 
    Date: Tue, 08 Nov 2016 00:03:23 GMT 
    Content-Language: en-US 
    Content-Type: application/json;charset=UTF-8 

Response Entity: 
�  \�1 
�@E��:H 
���B��C2����X�wנ��z�{%1�vw��:ga�����4$ ������k�Q�-i�����y��T��!f��� c� ��iK-��?z� ���dW�� 

這就是實體主體應該是(粘貼在任何瀏覽器的URL和請參閱:

{ 
    "errorMessage" : "Please check your details and try again.", 
    "error" : 400, 
    "errorTitle" : "Sorry, that is not a valid VIN.", 
    "vin" : "XXXXXXXXXXXXXXXXX" 
} 

我正在使用JDK版本1.8.0_102。我認爲問題在響應實體解析時發生,因爲報告的內容長度135是正確的值,通過在Chrome瀏覽器調試窗口中運行此請求來確認。

Content-Type響應標頭顯示charset = UTF-8,這是我的JVM運行的。是什麼賦予了?整個下午工作完成後,我完全陷入困境。

+1

'內容編碼:gzip'? –

+0

賓果!我以爲我已經排除了,因爲我沒有發送gzip的Accept-Encoding標頭。當我發出返回200響應的請求時,它不會被壓縮。我猜服務器端有一個錯誤,如果響應是400,則忽略Accept-Encoding請求頭。 –

+0

如果您將此作爲答案而不是評論添加,我將接受它作爲解決方案。 –

回答

1

如果你檢查你的響應頭,你會發現

Content-Encoding: gzip 

的亂碼實際上拉上。

0

您可以解壓縮該響應。

WebTarget target = ... 
target.register(GZipEncoder.class); 

在此更改後,您所做的readEntity事情應該可以正常工作。

這項工作在澤西島2.26。

對於較早的版本,解決方案稍有不同。參考https://stackoverflow.com/a/7574663/2695332