Java 在CXF客户端中启用gzip压缩

Java 在CXF客户端中启用gzip压缩,java,web-services,cxf,Java,Web Services,Cxf,我想让我的客户使用gzip。我在服务器中启用了GZip功能。客户端似乎没有发送正确的头: POST /api/v1/data HTTP/1.1 Content-Type: text/xml; charset=UTF-8 Accept: */* SOAPAction: "" User-Agent: Apache CXF 2.6.2 Cache-Control: no-cache Pragma: no-cache Host: localhost:8001 Connection: keep-alive

我想让我的客户使用gzip。我在服务器中启用了GZip功能。客户端似乎没有发送正确的头:

POST /api/v1/data HTTP/1.1
Content-Type: text/xml; charset=UTF-8
Accept: */*
SOAPAction: ""
User-Agent: Apache CXF 2.6.2
Cache-Control: no-cache
Pragma: no-cache
Host: localhost:8001
Connection: keep-alive
Content-Length: 539
下面是我创建客户端的代码:

 private static final QName SERVICE_NAME = new QName(
            "http://xxx/", "IData");
    private static final QName PORT_NAME = new QName(
            "http://xxx/", "IDataPort");
    IData port;

    public void initPort() {
        Service service = Service.create(SERVICE_NAME);
        // Endpoint Address
        String endpointAddress = ClientUtil.getUrl()
                + "data";

        // Add a port to the Service
        service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
                endpointAddress);

        port = service.getPort(IData.class);
    }
IData接口实现了GZip注释:

@WebService
@GZIP
public interface IData ....
解决方案:

修订后,您需要的是:

Client client = ClientProxy.getClient(port);
client.getInInterceptors().add(new GZIPInInterceptor());
client.getOutInterceptors().add(new GZIPOutInterceptor());
在那之后,它起了作用。

据我所知

“GZIP是一种协商增强。也就是说,来自 客户端将不会被gzip,但会添加一个Accept头,如果 服务器支持GZIP压缩,响应将被GZIP压缩并 任何后续请求也将被删除。”


检查web服务是否接受Gzip,并只检查第一个请求之后的请求。

上述答案的更详细答案

Client client = ClientProxy.getClient(port);

//this line to send compressed(gzip) request to server
client.getOutInterceptors().add(new GZIPOutInterceptor());

//this in to uncompress server response at client side
client.getInInterceptors().add(new GZIPInInterceptor());

当来自服务器的响应中只有gzip'而不是来自客户端的请求时,则需要添加标头和
gzipinterceptor
,如下所示:

// add accept-encoding header
Map<String, Object> requestHeaders = new HashMap<>();
requestHeaders.put("Accept-Encoding", new ArrayList<>(Arrays.asList("gzip")));
((BindingProvider)service).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);

// encode response from server
client.getInInterceptors().add(new GZIPInInterceptor());
//添加接受编码头
Map requestHeaders=new HashMap();
requestHeaders.put(“接受编码”),新的ArrayList(Arrays.asList(“gzip”));
((BindingProvider)服务).getRequestContext().put(MessageContext.HTTP_请求_头,requestHeaders);
//对来自服务器的响应进行编码
client.getInInterceptors().add(新的gzipinterceptor());

启用gzip的最简单方法:

List<Feature> features = Arrays.asList(new GZIPFeature())
final WebClient webClient = WebClient.create(uri, null, features, null);
List features=Arrays.asList(新的GZIPFeature())
final-WebClient-WebClient=WebClient.create(uri,null,features,null);

GZipFeature将自动添加“in-interceptor”、“out-interceptor”和“out-fault interceptor”。

标题是否来自某个网络分析仪,像tcpmon?我使用Grinder代理连接并获得流量转储。我需要配置客户端,它将发送头以触发您提到的协商。但是谢谢!对于JAX-RS RESTful客户端:
Client-Client=WebClient.Client(端口);ClientConfiguration=WebClient.getConfig(客户端);config.getInInterceptors();config.getOutiterCeptors().add(新的GZIPOutInterceptor())为什么被否决。。?是否提供了更多的澄清。。?