当前位置: 首页 > 工具软件 > wsdl2php > 使用案例 >

php webservice创建,php wsdl SOAP创建WebService

曾喜
2023-12-01

这几天,为了php创建一个“可以轻松理解”的WSDL文件而折腾了一会,实话说,php在这方面还是一个SB,即使最新的版本,还是令我比较失望的。但,我还是有解决方案的。

Tags:phpwsdlSOAPWebService

来,先搞个demo上来瞧瞧。创建一个WebService层比较简单:

class TestWebServices2 {

function GetGUIDNode($GUID1,$GUID2){

Return '$GUID1='.$GUID1.',and $GUID2='.$GUID2;

}

}

ini_set("soap.wsdl_cache_enabled", "0"); //禁止wsdl缓存

$server =  new SoapServer('server3.wsdl',array('uri'=>'urn:TestWebServices2'));

$server->setClass("TestWebServices2");

$server->handle();

?>

这个服务层的wsdl文件我们暂时不说,当作已经存在了,再看客户端代码:

header("Content-Type: text/html; charset=utf-8");

$ws     = "http://s/test/oksoap/server3.php?wsdl";

$client = new SoapClient($ws,array('trace' => 1,'uri'=>'urn:TestWebServices2'));

echo("SOAP服务器提供的开放函数:");

echo('

');

var_dump($client->__getFunctions());

echo('

');

echo("SOAP服务器提供的Type:");

echo('

');

var_dump($client->__getTypes());

echo('

');

echo("执行GetGUIDNode的结果:");

try {

$username = $client->GetGUIDNode('5do8','para 2');

} catch (SoapFault $fault){

echo "Fault! code:",$fault->faultcode,", string: ",$fault->faultstring;

}

echo(htmlspecialchars($client->__getLastRequest()));

echo('


');

echo(htmlspecialchars($client->__getLastResponse()));

echo('


');

echo('


');

var_dump($username);

?>

OK,然后着手WSDL部分的说明,首先,我这里说的是WSDL1.1,烂!不很严格主要是。

很多网上的SB说可以用ZEND创建一个wsdl就完事了,这种同学可能在php5.2.x这种最强版本(^-^)下还没测试过或者没有仔细的看php服务端的返回值,很负责任的说,empty,对了,生成的WDSL最好若经过M$的WSDL根据的验证。。。就OK了。

ZEND创建的WSDL没错,错在php的SoapServer无法识别一个最正常的WSDL文件,shit!问题就在namespace下面。

我先说说一个正常的WSDL的几个部分:

1: wsdl:types 类型,指明W3C的XMLSchema下面不识别的。

2:wsdl:message 消息,传递的信号。

3:wsdl:portType 指明匹配消息与执行的方法

4:wsdl:binding 真正绑定执行服务器方法与客户端方法

5:wsdl:service 公开的WebService名称

这五大部分的关系就是逐步加深,一个迂回。

我这里只说wsdl:types和wsdl:message在php解析中的问题,首先看:

这是一个请求的消息,一个message封装了part部分的参数,其中part有三个重要属性,name就是名称,type就是类型,还有个element,就是wsdl:types所定义的TYPE!问题就在这里,PHP目前还无法正确识别element所定义的类型。

so...

解决方案:

1:找出WSDL文件,保证

2:找到wsdl:message这个,其中的wsdl:part的element属性全部换成type指明的,type="xsd:string"这种。

然后可以通过微软wsdl的验证。

补充:这样php的__getTypes将是array(0),这个关系不大。

 类似资料: