8

クライアントに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 ....
4

5 に答える 5

19

解決:

改訂後、これはあなたが必要とするものです:

Client client = ClientProxy.getClient(port);
client.getInInterceptors().add(new GZIPInInterceptor());
client.getOutInterceptors().add(new GZIPOutInterceptor());

その後、それは機能しました。

于 2012-09-21T03:14:25.500 に答える
1

http://fusesource.com/docs/esb/4.4/cxf_jaxws/JavaFirst-AnnotateCxf-Compress.htmlからわかるように

「GZIP はネゴシエートされた拡張機能です。つまり、クライアントからの最初のリクエストは gzip されませんが、Accept ヘッダーが追加されます。サーバーが GZIP 圧縮をサポートしている場合、応答は gzip され、後続のリクエストも同様です。 "

Web サービスが Gzip を受け入れるかどうかを確認し、最初のリクエスト以降のリクエストのみを確認します。

于 2012-09-26T00:06:36.563 に答える
1

クライアントからのリクエストではなく、サーバーからのレスポンスに gzip のみが含まれている場合は、GZIPInInterceptor次のようにヘッダーなどを追加する必要があります。

// 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());
于 2016-01-18T11:05:01.237 に答える
0

上記の回答に対するより詳細な回答

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());
于 2015-06-04T21:48:58.843 に答える