前段时间做一个用户接口,对方提供WebService方式的接口供调用,记录遇到的几个问题
1、Soap1.1 、 Soap1.2 与SoapAction
错误描述:用saaj访问axis2构建的WS,返回错误消息:
com.sun.xml.internal.messaging.saaj.soap.MessageImpl identifyContentType
严重: SAAJ0537: Invalid Content-Type. Could be an error message instead of a SOAP message
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Invalid Content-Type:application/xml. Is this an error message instead of a SOAP response?
at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:146)
错误分析:返回的Soap消息的Content-Type是application/xml,saaj不识别此
Content-Type,认为返回的不是Soap响应
原因:1) 客服端saaj能识别的Content-Type为text/xml和application/soap+xml
2) axis2返回的为application/xml,之所以返回此类型,是因为axis2根据请求类型返回不同Content-Type的内容,请求类型有soap1.1、soap1.2、REST
3) 客户端发送请求时,发送soap1.1但是代码里MIME头未加SoapAction设置,axis2是通过SoapAction的指定区分Soap1.1与REST请求,这样请求被识别为REST,返回的content-tyee被设置为application/xml
解决方法:
1) 使用soap1.2
MessageFactory mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL)
2) 使用soap1.1并指定SoapAction
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage msg = mf.createMessage();
msg.getMimeHeaders().addHeader("SOAPAction", Qns);
* REST(Representational State Transfer): 表现性状态传输,与soap区别在于,提交请求直接用url+参数,返回结果为xml文档,不使用soap消息作为往返的信息载体,说是不只将http