设为首页 收藏本站
查看: 540|回复: 0

[经验分享] php调用java发布的webservice-python中国python培训

[复制链接]

尚未签到

发表于 2018-12-20 11:48:20 | 显示全部楼层 |阅读模式
  java 使用 spring webservice 发布的 service,由php使用SoapClient调用。
  遇到有一个奇怪的现象,java调用发布的webservice,没有问题,使用工具SOAP UI调用,没有问题,
  同样的php代码调用google的天气服务没问题,调用我们的wsdl就不行。
  经过摸索调试,发现如下问题,以及解决的过程。
  首先发布的wsdl如下:
Xml代码  



  •   
  •    
  •       
  •         
  •         
  •       
  •       
  •         
  •          
  •          
  •         
  •       
  •       
  •         
  •         
  •         
  •       
  •       
  •         
  •          
  •         
  •         
  •         
  •       
  •       
  •         
  •          
  •         
  •       
  •         
  •         
  •         
  •         
  •         
  •       
  •       
  •         
  •          
  •             
  •               
  •             
  •          
  •         
  •       
  •       
  •         
  •          
  •             
  •               
  •             
  •          
  •         
  •       
  •    
  •   
  •   
  •    
  •    
  •   
  •   
  •    
  •    
  •   
  •   
  •    
  •       
  •    
  •       
  •    
  •    
  •   
  •   
  •    
  •    
  •       
  •       
  •         
  •       
  •       
  •         
  •       
  •    
  •   
  •   
  •    
  •       
  •    
  •   

  其中定义了一个方法"Ping" 输入为PingRequest 和 PingResponse 其中PingRequest包含一个echo的属性,并集成一个BaseRequest的对象。
  下面是使用php调用的代码:
Php代码  


  最初我们调用的时候获取到的错误是找不到Ping方法,这个后来不确定是如何解决的。
  后来加了SoapClient  的调用参数WSDL_CACHE_NONE让soap调用的时候不缓存wsd,以避免服务器修改了wsdl无法及时更新。设置此参数后,每次调用,都会重 新load wsdl文件,因此监控java的log,将会拿到一个get请求,起初我们以为是调用wsdl的请求,后来发现,他是拿wsdl的请求。
  过了这关后,会遇到如下错误:Unable to parse URL
  这个原因经过google之后发现问题出在wsdl上面:
  这里有的wsdl会:
  这种方式使用java调用是没有问题的,但是使用php调用就是不行。再加上错误的提示信息,可以理解为,SoapClient没有智能的解析这个 location,因此无法调用到soap的地址(这里称之为地址,其实我也不知道是什么意思,要想搞懂的可以看wsdl的协议。)
  按照往上介绍的方法,在SoapClient调用里面增加参数:location =>"http://www.phpxiaoxin.com/soap/doorway"
  但这种方法显然是不太好的,更好的方法是在生成的wsdl中就将location参数直接设置成绝对的url地址不要是相对的,也不要是空。
  另外需要注意一个细节就是soap_version,分为:SOAP_1_1,SOAP_1_2 这两者发送的header是不一样的,一个是:text/xml一个是soap/xml,有的时候不兼容,就会将请求拒绝掉。
  最后还有一个问题就是组装调用方法参数:
  所调用方法应该组装的参数,主要看方法对应的wsdl中的input,对于Ping方法来说,就是PingRequest。
  pingRequest继承了一个BaseRequest,那么相当于PingRequest有:token、username、password,以及自身的echo,因此将这些属性直接组装成array塞进去就ok了。
  这里没有实验过一个方法对应多个输入对象应该如何处理,大家可以自己去试。而对已简单到String类型的输入参数来说,我这边的param为:$params = array('arg0'=>"hello111");
  不过我的这个我使用的是另外一个wsdl,其输入参数的wsdl为(使用spring+cxf+aegis数据绑定生成):
Xml代码  


  •    
  •    
  •    

  大家可以看看对应关系。是否能看出点什么规律。而对于复杂的对象,则可以层层的array进行嵌套。可以参开这个文章:PHP SOAP如何传入复杂对象
  最后提醒一下:
  php使用webservice的时候,需要确认开启了php_soap、php_curl的扩展(php.ini)
  关于php的soap client 以及其option参数,可以参考官网:http://www.php.net/manual/en/soapclient.soapclient.php
  使用php最好配置上xdebug以便可以调试,看到对象的值,相当明了,
  SoapClient里面有发送的request的xml一看就知道是否有问题,以及问题出在哪里。
  详情可以看一下xdebug等文章。
  再就是php调用的时候我增加了try,catch,并且将exception输出,这样输出的结果似乎比直接跑异常要详细。
  因此建议大家遇到问题的时候可以catch一下,以便能够看到详细的异常信息。
  另外如果有对spring发布webservice以及spring+cxf发布webservice有问题的也可以找相关文章看一下。这里就不贴地址了。我也曾经介绍过cxf的。
  总结一下,出错的缘由,由于本次webservice使用了手写xsd的方式,先手工写出了xsd,然后再生成的接口和对象,因此导致location设置不兼容。
  参考:
  unable-parse-url
  nusoap-how-to-change-content-type-of-request
  终于解决了PHP调用SOAP过程中的种种问题
  分享一个xml在线格式化的工具:http://www.shell-tools.net/index.php?op=xml_format


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-653569-1-1.html 上篇帖子: linux下执行PHP脚本 下篇帖子: 在php中如何快速交换数组元素的值
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表