webservice 调用的问题? 400 报错
这几天一直在做接口开发,无奈接口一直调不通,很是痛苦,求助
我的webservice接口是用axis2 1.6.1 发布的,用自己写的测试类能访问,在浏览器中浏览?wsdl也正常,soapui测试也能调通,但客户那边死活调不通,而且用户那边没有开发人员,已经不知道接口是怎么调用的了,无奈只能抓包看请求,大家看看这是什么原因照成的接口不通,客户那边怎么调的啊?
下面是我自己调接口时抓包情况
请求
.2...+....uOa."P.@).=..POST /sjjs/services/AuthSync HTTP/1.1 Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_C20565CA2368702C271473486841111; type="application/xop+xml"; start="<0.urn:uuid:C20565CA2368702C271473486841111@apache.org>"; start-info="text/xml"; charset=UTF-8 SOAPAction: "http://myserver.example/DoSomething" User-Agent: Axis2 Host: 10.1.50.211:11141 Transfer-Encoding: chunked
参数
.2...+.....Oa."P.@).R..22a --MIMEBoundaryurn_uuid_C20565CA2368702C271473486841111 Content-Type: application/xop+xml; charset=UTF-8; type="text/xml" Content-Transfer-Encoding: binary Content-ID: <0.urn:uuid:C20565CA2368702C271473486841111@apache.org> <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><syncU xmlns="http://webservice.wwd.com/xsd"><arg0 xmlns="">gf</arg0></syncU></soapenv:Body></soapenv:Envelope> --MIMEBoundaryurn_uuid_CC20565CA2368702C271473486841111-- 0这样我测试是通过的,接口能正常工作,正常返回。
客户调用抓包:
请求
......W.POST /axis2/services/tyqxInterface HTTP/1.1 Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 SOAPAction: Content-Type: text/xml; charset=utf-8 Content-Length: 1180 User-Agent: Java1.6.0_05 Host: 10.10.10.1:8080 Connection: Keep-Alive
参数
.e'......k.RV............. ......W. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <ns2:syncU xmlns:ns2="http://www.ssa.com/isc/service/"> <UserList><USER_ID>1115</USER_ID><LOGIN_NAME>hhhs</LOGIN_NAME><REAL_NAME>.........</REAL_NAME> <USER_STATUS>1</USER_STATUS><BIZORG_ID>15648as5d456</BIZORG_ID><EMPLOY_NO>2300131144</EMPLOY_NO> <UPDATE_DATE>2016-09-10 13:49:01.075</UPDATE_DATE><IS_DELETED>0</IS_DELETED></UserList></ns2:syncU></SOAP-ENV:Body></SOAP-ENV:Envelope>
接口内有异常捕获,任何异常都捕捉了。问题就是,客户死活掉不通,tomcat报transport.http.axisServlet java.lang.StringIndexOutOfBound。
求解
回来结问吧,先感谢 乌龟壳 的回答。 问题找到了,因为开发工具不一致导致的这个问题。
以前都是用axis2或x-fire技术开发webservice接口,也没仔细学习过webservice开发,不了解wsdl和sxd有什么用,也没接触过java拓展包带的ws服务,导致了接口调不通这个问题。
客户那边希望我们这边以jax-ws的方式开发接口,但完全不给我们任何技术方面的说明,也没说用什么方式开发,只给了一张提供参数表,是表格,不是参数。我们这边用axis2发布了,内部测试完全通过但客户死活调用不通,通过抓包看数据,在网上查找资料对比后发现些许端倪,我们和客户调用接口的方式不一样,参数传递方式不一样。观察抓包就可以看出这两者的差别了,jax-ws是直接传的参数,而axis2(内部测试)在参数前还有一段说明,具体内容没去解析,有兴趣的朋友可以去看看。在axis2开发中我们都没有去修改名字空间等东西,完全靠axis2自动生成,这样造成的结果就是返回结果不可控,我们直接就返回的字符串,而客户那边却不接收,结果我们的wenservice接收不了他们的请求,也不能返回他们期望的格式。
axis2发布的服务未修改名字空间及wsdl默认使用<arg0>参数</arg0>这样的格式来获取参数,而客户那边传来的参数并不是字符串,并没有使用<arg0></arg0>传参。返回类似。
解决办法:使用jax-ws开发webservice接口,自控参数及返回值,可通过@HandlerChain(file="handler-chain.xml")这样的方式获取入参SOAP和返回SOAP。
另外提一点,使用eclipse开发jax-ws(web service project)时使用java ee5中的jar包,不能再引入axis2的jar包,两者有冲突,某些类会被覆盖导致不能正常使用。
######既然你都抓到包了,把客户的包写个http程序模拟下发给你自己,应该也会报错的,然后你在代码里调下。既然你有linux,可以用curl模拟比较方便点。######还有另外一条路,不用webservice,看看对方接受什么样的格式比较好版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。