2016-11-08 3 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을 붙여 가정하고있는 것이다 여기

는 단순화 된 테스트 케이스입니다) 자신에 대한 참조 : 나는 JDK 버전 1.8.0_102을 사용하고

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

. 나는 135라는보고 된 content-length가 올바른 값이며 Chrome 브라우저 디버그 창에서이 요청을 실행하여 확인했기 때문에 응답 엔티티가 구문 분석 될 때 문제가 발생했다고 생각합니다.

Content-Type 응답 헤더에는 JVM이 실행되는 charset = UTF-8이 표시됩니다. 뭐라 구요? 나는 오후 내내이 일을하고 난 후 완전히 혼란스러워. 당신이 당신의 응답 헤더를 검사하는 경우

+1

'Content-Encoding : gzip'을 참조하십시오. –

+0

빙고! 제가 gzip의 Accept-Encoding 헤더를 보내지 않았기 때문에 제가 배제했다고 생각했습니다. 200 응답을 리턴하는 요청을 발행하면 gzipped되지 않습니다. 응답이 400 인 경우 Accept-Encoding 요청 헤더를 무시하는 버그가 서버 측에있는 것 같습니다. –

+0

답변 대신 댓글로 추가하면 해결책으로 받아 들일 것입니다. –

답변

1

, 당신은 잘못된 텍스트가 실제로

Content-Encoding: gzip 

을 압축됩니다 알 수 있습니다.

0

해당 응답의 압축을 풀 수 있습니다.

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

이렇게 변경하면 readEntity 작업이 잘 진행됩니다.

Jersey 2.26에서 작동합니다.

이전 버전의 경우 솔루션이 약간 다릅니다. https://stackoverflow.com/a/7574663/2695332