您当前的位置: 首页 > 网站编程 > PHP教程 > PHP5 在调用 JAVA WebService 时遇到的各种问题解决方法

PHP5 在调用 JAVA WebService 时遇到的各种问题解决方法

作者:不详 来源:网络 发布时间: 2014-08-21 17:55 点击:
开始gank。 服务端: Spring3.0.5+CXF2.4,JDK1.6 应该是自动生成的wsdl文件服务端不是我们的 客户端: PHP5.1.3 碰见的第一个问题: SOAP-ERROR: Encoding: object has no 'id' property 但是API文档上说不需要id,查看wsdl文件内容 xs:complexType name=sealxs:seque

PHP5 在调用 JAVA WebService 时遇到的各种问题解决方法

  开始gank。

  服务端:

  Spring3.0.5+CXF2.4,JDK1.6

  “应该是”自动生成的wsdl文件<服务端不是我们的>

  客户端:

  PHP5.1.3

  碰见的第一个问题:

  SOAP-ERROR: Encoding: object has no 'id' property

  但是API文档上说不需要id,查看wsdl文件内容

  <xs:complexType name="seal"><xs:sequence><xs:element name="id" type="xs:long"/><xs:element minOccurs="0" name="name" type="xs:long"/>

  查阅schema文档,有如下内容:

  通过 schema,我们可使用 maxOccurs 和 minOccurs 属性来定义某个元素可能出现的次数。maxOccurs 定义某元素出现次数的最大值,而 minOccurs 则定义某元素出现次数的最小值。maxOccurs 和 minOccurs 的默认值都是 1!(好吧,这个是服务端的问题?然后自己随便写了个值,通过了。。。)

  PS:中间有个小环节,我尽然去看了PHP的源代码。。。

  SOAP中的php_encoding.c里面的函数 model_to_xml_object

  static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, zval *object, int style, int strict TSRMLS_DC)

  //一小段代码

  } else if (model->min_occurs == 0) {

  return 2;

  } else {

  if (strict) {

  soap_error1(E_ERROR, "Encoding: object has no '%s' property", model->u.element->name);//明显就是<span style="font-family:Times New Roman;">它!</span>

  }

  return 0;

  }

  我是从这里发现问题出现在min_occurs上,所以才解决了上面问题(是不是对方不太规范?)

  第二个问题:

  looks like we got no XML document

  这个可是郁闷了,解决了好久

  已经返回来数据了,然后我抓包(貌似有方法可以直接显示数据),发现返回的数据类似如下格式:

  HTTP/1.1 200 OK

  Server: Apache-Coyote/1.1

  Content-Type: multipart/related; type="application/xop+xml"; boundary="uuid:0c37c356-41de-4361-9835-ab8dc023dcac"; start="<root.message@cxf.apache.org>"; start-info="text/xml"

  Content-Length: 790

  Date: Tue, 04 Dec 2012 07:57:45 GMT

  --uuid:0c37c356-41de-4361-9835-ab8dc023dcac

  Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";

  Content-Transfer-Encoding: binary

  Content-ID: <root.message@cxf.apache.org>

  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:createSealResponse xmlns:ns2="http://service.api.seal.kx.knet.cn/"><return><code>2003</code><date>2012-12-04 15:57:46.124</date><msg>Logic error</msg><result>sfn004.cn:瀵逛笉璧凤紝姝ゅ煙鍚嶁€滃彲淇$綉绔欌€濋獙璇佹湇鍔$敵璇锋鍦ㄥ鏍镐腑锛屼笉鑳藉啀娆℃敞鍐岋紒</result><result><span style="font-family:Times New Roman;">zhjx922.com</span>:瀵逛笉璧凤紝姝ゅ煙鍚嶁€滃彲淇$綉绔欌€濋獙璇佹湇鍔$敵璇锋鍦ㄥ鏍镐腑锛屼笉鑳藉啀娆℃敞鍐岋紒</result></return></ns2:createSealResponse></soap:Body></soap:Envelope>

  --uuid:0c37c356-41de-4361-9835-ab8dc023dcac--

  明显不是XML。。所以PHP老大就报错了

  询问对方,答复是:

  CXF设置了如下上传属性,关键点就是MTOM,PHP SOAP扩展默认是乎不支持这个玩意

  <jaxws:properties>

  <entry key="mtom-enabled" value="true" />

  </jaxws:properties>

  baidu,google 可以通过WSO2 WSF FOR PHP 扩展实现,嫌弃麻烦继续找。。。

  看了一下官方文档介绍

  http://cn2.php.net/soap

  有条回复帮我解决了,最终解决方法如下:

  /**

  * 继承SoapClient类,重写__doRequest方法

  * @author zhjx922

  */

  class ZSoapClient extends SoapClient

  {

  public function __doRequest($request, $location, $action, $version, $one_way = 0)

  {

  $response = parent::__doRequest($request, $location, $action, $version, $one_way);

  //根据实际情况做处理。。。,如果是<?xml开头,改成<?xml

  $start=strpos($response,'<soap');

  $end=strrpos($response,'>');

  $response_string=substr($response,$start,$end-$start+1);

  return($response_string);

  }

  }
分享到:
本文"PHP5 在调用 JAVA WebService 时遇到的各种问题解决方法"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 广告合作 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4