2013-01-18 90 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。 –