开始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);
}
}