Heim > php教程 > php手册 > PHP5 在调用 JAVA WebService 时遇到的各种问题解决方法

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

WBOY
Freigeben: 2016-06-13 11:33:40
Original
975 Leute haben es durchsucht

 开始gank。

服务端:

Spring3.0.5+CXF2.4,JDK1.6

“应该是”自动生成的wsdl文件

客户端:

PHP5.1.3

碰见的第一个问题:

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

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

查阅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);//明显就是它!
}
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=""; 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:
20032012-12-04 15:57:46.124Logic errorsfn004.cn:瀵逛笉璧凤紝姝ゅ煙鍚嶁€滃彲淇$綉绔欌€濋獙璇佹湇鍔$敵璇锋鍦ㄥ鏍镐腑锛屼笉鑳藉啀娆℃敞鍐岋紒zhjx922.com:瀵逛笉璧凤紝姝ゅ煙鍚嶁€滃彲淇$綉绔欌€濋獙璇佹湇鍔$敵璇锋鍦ㄥ鏍镐腑锛屼笉鑳藉啀娆℃敞鍐岋紒
--uuid:0c37c356-41de-4361-9835-ab8dc023dcac--
明显不是XML。。所以PHP老大就报错了

 

询问对方,答复是:

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



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);

//根据实际情况做处理。。。,如果是 $start=strpos($response,' $end=strrpos($response,'>');
$response_string=substr($response,$start,$end-$start+1);
return($response_string);
}
}

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage