前段时间做一个用户接口,对方提供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协议作为单纯的传输协议什么的,第一次听说这个概念,但实际上以前做Domino的时候经常用到,类似?readviewentries这样的扩展Url命令
*不单是axis2,只要使用soap1.1,则Soap请求消息的SoapAction都是必须指定的,否则会出错,SoapAction的值可以从服务的wsdl文档中查
2、部署碰到的问题
错误描述:本地测试通过,部署到服务器上出错
1)报不认SOAPConstants.SOAP_1_2_PROTOCOL常量,改成MF.newInstance()通过,可能和2)问题的原因一样
2)我想用的是Javax.xml.soap包下的类,但是似乎在服务器上执行都被识别指向成了org.apache.axis下的一些类而报异常,发现服务器以前有部署axis,把相关的包从服务器上删掉,并拷入sun的saaj相关的几个包,问题解决,网络上说jdk1.5以上直接支持saaj,是不是不要拷sun的saaj包可以直接用?
3、返回Soap消息处理
错误描述:测试时发现,返回的Soap消息,业务标签的尖括号都被转义,类似于: