2013-01-18 52 views
0

我写的JAX-WS(来自太阳)客户端,其使期望服务器的响应需要用gzip压缩服务电话:JAX-WS客户端:UnsupportedMediaException为gzip压缩的响应

Map<String, List<String>> theHeaders = new HashMap<String, List<String>>(); 
theHeaders.put("Content-Encoding", Collections.singletonList("gzip")); 
theHeaders.put("Accept", Collections.singletonList("application/x-gzip")); 
theHeaders.put("Accept-Encoding", Collections.singletonList("gzip, deflate")); 
theHeaders.put("Content-Type", Collections.singletonList("application/x-gzip")); 
((BindingProvider) client).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, theHeaders); 

按照提琴手,响应HTTP 200 (好)和肥皂响应是gzipped。 不过,我发现了以下错误:

com.sun.xml.ws.server.UnsupportedMediaException: Unsupported Content-Type: application/x-gzip Supported ones are: [application/soap+xml] 
at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:322) 
at com.sun.xml.ws.encoding.StreamSOAP12Codec.decode(StreamSOAP12Codec.java:107) 
at com.sun.xml.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCodec.java:156) 
at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:312) 
at com.sun.xml.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:295) 

read是JAX-WS应当支持开箱即用gzip压缩web服务的反应,但看起来事实并非如此。尽管事实响应包含Content-Type:application/x-gzip头,它会尝试使用适用于application/soap + xml的默认编解码器。

有没有一种方法,使其使用其他的编解码器,gzip的?有没有这样的编解码器?

回答

0

你所说的连结告诉它支持gzip当响应与

Content-encoding: gzip 

头中发送,除标准内容类型标题。如果服务器以Content-Type: application/x-gzip响应,它是一个不同的头文件,即使它本身支持gzip,它似乎也不会被支持。我不认为你应该设置这样的:

theHeaders.put("Accept", Collections.singletonList("application/x-gzip")); 

代替,只要设置接受编码gzip的包括:

theHeaders.put("Accept", Collections.singletonList("application/soap+xml")); 
theHeaders.put("Content-Type", Collections.singletonList("application/soap+xml")); 
theHeaders.put("Accept-Encoding", Collections.singletonList("gzip")); 
theHeaders.put("Content-Encoding", Collections.singletonList("gzip")); 
+0

所以,公正,以确保我没有得到一个错误:服务器方应该使用gzip内容编码头来响应_exactly_,而不是application/x-gzip使其在客户端被视为gzip? –

+0

@MikhailBerastau application/gzip是一个内容类型的头部值,gzip是应用程序编码的头部值。因此,对于所有的实现,服务器应该使用内容编码gzip来响应这个工作。对于某些Web服务客户端库,可以使用* also * application/gzip内容类型 - 对于一些不是。我根据错误消息猜测,在这种情况下,它不是。 – eis

+0

检查JAXWS-RT的来源,它使比较是这样的: 如果(!contentEncoding = NULL && contentEncoding.contains( “gzip的”)){ 在新= GZIPInputStream(IN); } 所以任何提及内容编码中的gzip都是可以接受的;内容类型 - 我认为你是对的,它应该是应用程序/ soap + xml。 –