webservice 调用的问题

四文鱼 发布于 2016/09/10 16:49
阅读 628
收藏 1

这几天一直在做接口开发,无奈接口一直调不通,很是痛苦,求助

我的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。

求解





加载中
0
四文鱼

  回来结问吧,先感谢 乌龟壳 的回答。 问题找到了,因为开发工具不一致导致的这个问题。

  以前都是用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包,两者有冲突,某些类会被覆盖导致不能正常使用。

0
乌龟壳
乌龟壳
既然你都抓到包了,把客户的包写个http程序模拟下发给你自己,应该也会报错的,然后你在代码里调下。既然你有linux,可以用curl模拟比较方便点。
0
乌龟壳
乌龟壳
还有另外一条路,不用webservice,看看对方接受什么样的格式比较好
返回顶部
顶部