无法在 SOAP WebService 客户端中修改 http accept header - JAX-WS 2.2.10 - JDK1.7
Cannot modify http accept header in SOAP WebService client - JAX-WS 2.2.10 - JDK1.7
我将 Web 服务客户端从 jdk1.6 jax-ws(v1?旧版 - 2005)迁移到 jdk1.7 jax-ws 2.2.10。
旧的可以用,但我对新的有问题:
该服务(来自另一个社会,php 服务器)回复我:http 406 错误,不可接受。
我发送的接受header是:
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
对于旧版本,我有:
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-type: text/xml;charset="utf-8"
所以我尝试像这样修改 http header(在我的绑定处理程序链中的新处理程序中):
在我的客户中:
javax.xml.ws.Binding binding = ((BindingProvider) ServiceXXX).getBinding();
List<Handler> hchain = binding.getHandlerChain();
if (hchain == null) {hchain = new ArrayList<Handler>();}
hchain.add(new HTTPUserAgentHandler());
binding.setHandlerChain(hchain);
在我的新处理程序中:
Map<String, List<String>> headers = (Map<String, List<String>>) context.get(MessageContext.HTTP_REQUEST_HEADERS);
if (null == headers) {headers = new HashMap<String, List<String>>();}
headers.put("Accept", Arrays.asList("text/xml", "multipart/related", "*/*"));
context.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
我的 http header 现在是正确的,但在 HttpTransportPipe class 中,它被覆盖了:
reqHeaders.put("Content-Type", Collections.singletonList(ct.getContentType()));
if (ct.getAcceptHeader() != null) {
reqHeaders.put("Accept", Collections.singletonList(ct.getAcceptHeader()));
}
if (binding instanceof SOAPBinding) {
writeSOAPAction(reqHeaders, ct.getSOAPActionHeader());
}
服务器,显然是 1.1,需要我用 "*/*"
发送一个接受
知道我该怎么做吗?
我想我找到了一个方法,它不是完美的解决方案......(如果有人有更好的..)
所以 :
我在 ./src/META-INF/services
中添加了一个名为 com.sun.xml.ws.api.pipe.TransportTubeFactory
的文件,其中有:
com.YYY.XXX.MonHttpTransportTubeFactory
我添加了这个class:
package com.YYY.XXX;
import com.sun.xml.ws.api.pipe.ClientTubeAssemblerContext;
import com.sun.xml.ws.api.pipe.TransportTubeFactory;
import com.sun.xml.ws.api.pipe.Tube;
import com.sun.xml.ws.transport.http.client.HttpTransportPipe;
public class MonHttpTransportTubeFactory extends TransportTubeFactory{
@Override
public Tube doCreate(ClientTubeAssemblerContext context) {
context.setCodec(new MonSOAPBindingCodec(context.getBinding().getFeatures()));
return new HttpTransportPipe(context.getCodec(), context.getBinding());
}
}
和这个:(现有 SOAPBidingCodec
jaxws-ri src 的副本):
public class MonSOAPBindingCodec extends MonMimeCodec implements com.sun.xml.ws.api.pipe.SOAPBindingCodec {
...
public MonSOAPBindingCodec(WSFeatureList features, StreamSOAPCodec xmlSoapCodec) {
super(getSoapVersion(features), features);
this.xmlSoapCodec = xmlSoapCodec;
xmlMimeType = xmlSoapCodec.getMimeType();
String clientAcceptedContentTypes = xmlSoapCodec.getMimeType() + ", */*";
WebServiceFeature fi = features.get(FastInfosetFeature.class);
...
所以该服务调用我的 HttpTransportTubeFactory
并包括我的自定义 SOAP 编解码器。
不是很漂亮,但是很管用..
我将 Web 服务客户端从 jdk1.6 jax-ws(v1?旧版 - 2005)迁移到 jdk1.7 jax-ws 2.2.10。 旧的可以用,但我对新的有问题: 该服务(来自另一个社会,php 服务器)回复我:http 406 错误,不可接受。
我发送的接受header是:
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
对于旧版本,我有:
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-type: text/xml;charset="utf-8"
所以我尝试像这样修改 http header(在我的绑定处理程序链中的新处理程序中):
在我的客户中:
javax.xml.ws.Binding binding = ((BindingProvider) ServiceXXX).getBinding();
List<Handler> hchain = binding.getHandlerChain();
if (hchain == null) {hchain = new ArrayList<Handler>();}
hchain.add(new HTTPUserAgentHandler());
binding.setHandlerChain(hchain);
在我的新处理程序中:
Map<String, List<String>> headers = (Map<String, List<String>>) context.get(MessageContext.HTTP_REQUEST_HEADERS);
if (null == headers) {headers = new HashMap<String, List<String>>();}
headers.put("Accept", Arrays.asList("text/xml", "multipart/related", "*/*"));
context.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
我的 http header 现在是正确的,但在 HttpTransportPipe class 中,它被覆盖了:
reqHeaders.put("Content-Type", Collections.singletonList(ct.getContentType()));
if (ct.getAcceptHeader() != null) {
reqHeaders.put("Accept", Collections.singletonList(ct.getAcceptHeader()));
}
if (binding instanceof SOAPBinding) {
writeSOAPAction(reqHeaders, ct.getSOAPActionHeader());
}
服务器,显然是 1.1,需要我用 "*/*"
发送一个接受
知道我该怎么做吗?
我想我找到了一个方法,它不是完美的解决方案......(如果有人有更好的..)
所以 :
我在 ./src/META-INF/services
中添加了一个名为 com.sun.xml.ws.api.pipe.TransportTubeFactory
的文件,其中有:
com.YYY.XXX.MonHttpTransportTubeFactory
我添加了这个class:
package com.YYY.XXX;
import com.sun.xml.ws.api.pipe.ClientTubeAssemblerContext;
import com.sun.xml.ws.api.pipe.TransportTubeFactory;
import com.sun.xml.ws.api.pipe.Tube;
import com.sun.xml.ws.transport.http.client.HttpTransportPipe;
public class MonHttpTransportTubeFactory extends TransportTubeFactory{
@Override
public Tube doCreate(ClientTubeAssemblerContext context) {
context.setCodec(new MonSOAPBindingCodec(context.getBinding().getFeatures()));
return new HttpTransportPipe(context.getCodec(), context.getBinding());
}
}
和这个:(现有 SOAPBidingCodec
jaxws-ri src 的副本):
public class MonSOAPBindingCodec extends MonMimeCodec implements com.sun.xml.ws.api.pipe.SOAPBindingCodec {
...
public MonSOAPBindingCodec(WSFeatureList features, StreamSOAPCodec xmlSoapCodec) {
super(getSoapVersion(features), features);
this.xmlSoapCodec = xmlSoapCodec;
xmlMimeType = xmlSoapCodec.getMimeType();
String clientAcceptedContentTypes = xmlSoapCodec.getMimeType() + ", */*";
WebServiceFeature fi = features.get(FastInfosetFeature.class);
...
所以该服务调用我的 HttpTransportTubeFactory
并包括我的自定义 SOAP 编解码器。
不是很漂亮,但是很管用..