Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Jersey客户端响应提供垃圾数据?_Java_Jersey Client - Fatal编程技术网

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

Java 为什么Jersey客户端响应提供垃圾数据?,java,jersey-client,Java,Jersey Client,当我读取Http响应实体时,我无法理解为什么代码会给我垃圾数据。只有当我向一个特定的URL发出请求,请求中包含的数据导致400响应时,才会发生这种情况。我的代码试图读取响应实体,但正如您在下面看到的,它是垃圾 下面是一个简化的测试用例: import org.junit.Test; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Invoca

当我读取Http响应实体时,我无法理解为什么代码会给我垃圾数据。只有当我向一个特定的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);
    }
}
这就是实体主体的含义(将URL粘贴到任何浏览器中,然后自己查看):

我使用的是JDK版本1.8.0_102。我认为在解析响应实体时会出现问题,因为报告的内容长度135是正确的值,通过在Chrome浏览器调试窗口中运行此请求来确认


Content-Type响应头显示charset=UTF-8,这就是我的JVM的运行方式。有什么好处?整个下午都在忙这个,我完全被难倒了。

如果你检查你的回复标题,你会注意到

Content-Encoding: gzip

乱码文本实际上已压缩。

您可以解压缩该响应

WebTarget target = ...
target.register(GZipEncoder.class);
更改后,您正在执行的
readEntity
操作应该可以正常工作

这在泽西岛2.26有效


对于早期版本,解决方案略有不同。请参阅

内容编码:gzip
?宾果!我想我已经排除了这一点,因为我没有发送gzip的接受编码头。当我发出一个返回200响应的请求时,它不是gzip。我猜服务器端存在一个错误,如果响应为400,则会忽略Accept Encoding请求标头。如果您将此作为答案而不是注释添加,我将接受它作为解决方案。谢谢,这正是我要寻找的。节省了很多时间。
Content-Encoding: gzip
WebTarget target = ...
target.register(GZipEncoder.class);