为什么Jersey客户端响应会提供垃圾数据?

时间:2016-11-08 00:16:36

标签: java jersey-client

当我读取Http Response实体时,我无法弄清楚为什么我的代码会给我垃圾数据。只有在我向一个特定URL发出请求时,才会发生这种情况,该数据导致400响应。我的代码尝试读取响应实体,但正如您在下面看到的那样,它是垃圾。

这是一个简化的测试用例:

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正在运行的。是什么赋予了?在整个下午工作之后,我完全难过了。

2 个答案:

答案 0 :(得分:2)

如果您检查自己的回复标题,则会注意到

Content-Encoding: gzip

乱码文本实际上是压缩的。

答案 1 :(得分:1)

您可以解压缩该响应。

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

在此更改后,您正在执行的readEntity项工作正常。

这适用于泽西岛2.26。

对于早期版本,解决方案略有不同。请参阅https://stackoverflow.com/a/7574663/2695332