用java调用https webservice

aligerzader 2009-10-20 01:41:46
最近在做一个调用webservice的客户端,之前做过,以为很容易,但这过程中遇到的一些问题让我发现自己懂的还是太少。

webservice的服务端是需要证书认证的,证书已经发给我了,cer格式的,使用java的keytool工具提取证书后,在调用webservice时执行以下语句:

System.setProperty("javax.net.ssl.trustStore", "xxxx.truststore");

告诉服务端我客户端是有证书的,目前来看没问题。

接下来,我用axis2的wsdl2java生成了客户端的代码,结果一执行就出现如下错误:

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>[ISS.0088.9109] SOAP is only supported using HTTP POST protocol</faultstring>
<faultactor>http://bcv50s6e.vz.cit.alcatel.fr:8657/soap/WS_UPL</faultactor>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


在soap的开发文档中查到这个错,是因为请求的soap message格式错误,文档地址:http://documentation.softwareag.com/webmethods/wmsuite7/Developer/Guides/7-1-1_SOAP_Developers_Guide.pdf(89页)

这时对方要求我把soap request message发过去,我对webservice只是停留在用的阶段,会用axis,xfire之类的工具写服务端和客户端,但是对soap就是一知半解了,上网找资料,问同事,折腾了半天,总算把request message找出来了。同事给的方法是用tcp monitor之类的工具,但是webservice是https格式的,不能用,后来在生成的客户端代码里把SOAPEnvelope.toString()打出来才得到,如下:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns1:UPLGenerate xmlns:ns1="http://www.alcatel-lucent.com/webService/WS_UPL">
<OperationCode>1</OperationCode>
<Plant>2</Plant>
<QuoteNumber>3</QuoteNumber>
<UserID>4</UserID>
<IncludePriceType>5</IncludePriceType>
</ns1:UPLGenerate>
</soapenv:Body>
</soapenv:Envelope>


我猜测,请求message的格式是不是应该和错误返回的xml一样?如果是的话,我就要自定义请求message的格式了,求各位帮忙!
...全文
2971 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovezhouhuali 2011-04-07
  • 打赏
  • 举报
回复
正好 我要开始用soap webservice进行做接口了 以后请多多指教 受用了 可以留给联系方式么?
aligerzader 2009-10-27
  • 打赏
  • 举报
回复
问题全部解决了,遇到了很多之前没见过的问题,不过解决了问题这些经验都是我的宝贵财富了,哈哈
做人要厚道,分享一下

发现一楼给的错误代码不对,那个错误代码是在浏览器里直接请求得到的,错误应该是这个:

org.apache.axis2.AxisFault: [ISS.0088.9125] SOAP request does not conform to the SOAP message model

我是用axis2生成的客户端,默认的transfer-encoding是chunked,所以在soap 请求报文的body首尾会有两个数字,可以用tcpmon测试一下,.net或者其他一些server是不支持这种模式的,代码中设置一下就可以了,如下:
stub._getServiceClient().getOptions().setProperty(HTTPConstants.CHUNKED, false);

周末研究出来的,之前咨询了公司的一个senior,帮我查,也给了我一些建议,非常感谢他!

现在执行应该没问题了吧,我倒是想,结果又有问题了
Exception in thread "main" org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement xxxxResponse
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)


这个问题折腾了我三天,在网上查到很多,有的说要用wstx-asl-3.2.1.jar等等,都试了,不通,至少我这边不是因为这个错,很急,一点头绪没有,后来偶然在stub里把org.apache.axiom.soap.SOAPEnvelope _returnEnv打印出来了,就是_returnEnv.toString(),发现和用soapUI返回的结果不一样,因为这个webservice是https的,所以不能用tcpmon,这下明白了,因为返回response里的一下元素不是一直有的,但是在wsdl定义里却没有定义,即没写minOccurs="0",结果用这个wsdl生成的客户端代码如果没取到那些没返回的元素,自然会报错,在wsdl里加上minOccurs="0",重新生成客户端代码,测试,通过。

遇到的问题很烦人,但是收获也不小,这短短几天,让我对webservice的认识加深很多,很惭愧的说,以前只知道用axis等写服务端,然后用wsdl生成客户端,不知道用wsdl还可以生成服务端的。还好有这次机会,我进步了,大家共勉。

aligerzader 2009-10-23
  • 打赏
  • 举报
回复
问题依然没有解决,这中间遇到一些小问题,记录一下

(1)用cxf发布webservice时,生成的wsdl中参数名是arg0,arg1,arg2....,修改办法是在webservice接口中用@WebParam注解,例如:

public void method1(@WebParam(name="a")String a, (@WebParam(name="b")String b);

生成客户端的参数名就是name的值a 和 b了。

(2)cxf发布webservice,生成的wsdl中有<wsdl:import/>引用,有些客户端无法调用,这个是因为接口和实现类的targetNamespace不一样造成的,导致两个wsdl的targetNamespace也不一样,解决办法是在接口和实现类中加上targetNamespace的声明:

@WebService(targetNamespace="http://www.xxxx.com/webService")

这样只会生成一个wsdl了。

(3)有谁知道什么工具能像tcpmon那样监听soap request的,https的?我想看看soap request在发送时有没有被改过。
aligerzader 2009-10-22
  • 打赏
  • 举报
回复
服务端不是我这边的,而且用的是一个工具做的,不是axis或者xfire之类,我只是调用
  • 打赏
  • 举报
回复
最近在做一个调用webservice的客户端,之前做过,以为很容易,但这过程中遇到的一些问题让我发现自己懂的还是太少。

这个跟LZ同感啊,,,现在我也挠头呢.
我想知道LZ的这个信息(SOAP-Fault)是进行什么设置了?才会出现???

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client </faultcode>
<faultstring>[ISS.0088.9109] SOAP is only supported using HTTP POST protocol </faultstring>
<faultactor>http://bcv50s6e.vz.cit.alcatel.fr:8657/soap/WS_UPL </faultactor>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
aligerzader 2009-10-20
  • 打赏
  • 举报
回复
看到一篇帖子,说的是axis,方法是改源码

javax.xml.rpc.Namespace.Constants.java中的
public static final String NSPREFIX_SOAP_ENVELOPE = "soapenv";

org.apache.axis.Constants.java中的
public static final String NS_PREFIX_SOAP_ENV = "soapenv";

http://www.soidc.net/discuss/6/040408/11/247590_1.html
aligerzader 2009-10-20
  • 打赏
  • 举报
回复
我是用wsdl生成客户端的,而且我觉得几种方法都是差不多,我大概猜到是什么问题了,服务端那边应该是限定请求格式的,我需要在调用service时依照对方的格式来。

比如自定义命名空间:<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
要改成<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

或者是加上header等

我想知道axis2中有这类的api么?

jdk150 2009-10-20
  • 打赏
  • 举报
回复
你是把wsdl下载到本地后再用来生成client的吗?不是的话,可以试试
还有axis2生成客户端有四种方法,你也可以试试别的方法?

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧