php

位置:IT落伍者 >> php >> 浏览文章

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


发布日期:2022年10月13日
 
PHP5 在调用 JAVA WebService 时遇到的各种问题解决方法

开始gank

服务端

Spring+CXFJDK

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

客户端

PHP

碰见的第一个问题

SOAPERROR: 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="" name="name" type="xs:long"/>

查阅schema文档有如下内容

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


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

SOAP中的php_encodingc里面的函数 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 == ) {
return ;
} else {
if (strict) {
soap_error(E_ERROR "Encoding: object has no %s property" model>uelement>name);//明显就是<span style="fontfamily:Times New Roman;">它!</span>
}
return ;
}

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


第二个问题

looks like we got no XML document

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

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


HTTP/ OK
Server: ApacheCoyote/
ContentType: multipart/related; type="application/xop+xml"; boundary="uuid:ccdeabdcdcac"; start="<rootmessage@cxfapacheorg>"; startinfo="text/xml"
ContentLength:
Date: Tue Dec :: GMT


uuid:ccdeabdcdcac
ContentType: application/xop+xml; charset=UTF; type="text/xml";
ContentTransferEncoding: binary
ContentID: <rootmessage@cxfapacheorg>
<soap:Envelope xmlns:soap=":Body><ns:createSealResponse xmlns:ns="::</date><msg>Logic error</msg><result>sfncn:瀵逛笉璧凤纴姝ゅ烟钖嵝€滃彲淇$綉绔欌€濋獙璇佹湇锷$敌璇锋鍦ㄥ镙镐腑锛屼笉鑳藉啀娆℃敞鍐岋紒</result><result><span style="fontfamily:Times New Roman;">zhjxcom</span>:瀵逛笉璧凤纴姝ゅ烟钖嵝€滃彲淇$綉绔欌€濋獙璇佹湇锷$敌璇锋鍦ㄥ镙镐腑锛屼笉鑳藉啀娆℃敞鍐岋紒</result></return></ns:createSealResponse></soap:Body></soap:Envelope>
uuid:ccdeabdcdcac
明显不是XML所以PHP老大就报错了

询问对方答复是

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

<jaxws:properties>
<entry key="mtomenabled" value="true" />
</jaxws:properties>

baidugoogle 可以通过WSO WSF FOR PHP 扩展实现嫌弃麻烦继续找

看了一下官方文档介绍

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

/**
* 继承SoapClient类重写__doRequest方法
* @author zhjx
*/
class ZSoapClient extends SoapClient
{
public function __doRequest($request $location $action $version $one_way = )
{
$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+);
return($response_string);
}
}

上一篇:优化PHP代码的建议

下一篇:PHP5.3语言特性