您的位置:首页 > 编程语言 > PHP开发

php soap举例及wsdl文件的生成

2011-09-20 16:05 711 查看
PHP使用soap有两种方式。

一、用wsdl文件

服务器端myservice.php

<?php

classservice

{

publicfunctionHelloWorld()

		{

return"Hello";

}

publicfunctionAdd($a,$b)

		{	

return$a+$b;

}

}

$server=newSoapServer('soap.wsdl',array('soap_version'=>SOAP_1_2));

$server->setClass("service");

$server->handle();

?>
资源描述文件,可以用工具(zendstudio)生成。其实就是一个xml文件。


<?xmlversion="1.0"encoding="UTF-8"?><wsdl:definitionsxmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:tns="http://localhost/interface/"xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"name="soap"targetNamespace="http://localhost/interface/"><wsdl:types><xsd:schematargetNamespace="http://localhost/interface/"><xsd:elementname="HelloWorld"><xsd:complexType><xsd:sequence><xsd:elementname="in"type="xsd:string"/></xsd:sequence></xsd:complexType></xsd:element><xsd:elementname="HelloWorldResponse"><xsd:complexType><xsd:sequence><xsd:elementname="out"type="xsd:string"/></xsd:sequence></xsd:complexType></xsd:element><xsd:elementname="Add"><xsd:complexType><xsd:sequence><xsd:elementname="in"type="xsd:int"></xsd:element></xsd:sequence></xsd:complexType></xsd:element><xsd:elementname="AddResponse"><xsd:complexType><xsd:sequence><xsd:elementname="out"type="xsd:int"></xsd:element></xsd:sequence></xsd:complexType></xsd:element></xsd:schema></wsdl:types><wsdl:messagename="AddRequest"><wsdl:partname="a"type="xsd:int"></wsdl:part><wsdl:partname="b"type="xsd:int"></wsdl:part></wsdl:message><wsdl:messagename="AddResponse"><wsdl:partname="c"type="xsd:int"></wsdl:part></wsdl:message><wsdl:portTypename="TestSoap"><wsdl:operationname="Add"><wsdl:inputmessage="tns:AddRequest"></wsdl:input><wsdl:outputmessage="tns:AddResponse"></wsdl:output></wsdl:operation></wsdl:portType><wsdl:bindingname="soapSOAP"type="tns:TestSoap"><soap:bindingstyle="document"transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operationname="Add"><soap:operationsoapAction="http://localhost/interface/Add"/><wsdl:input><soap:bodyuse="literal"namespace="http://localhost/interface/"/></wsdl:input><wsdl:output><soap:bodyuse="literal"namespace="http://localhost/interface/"/></wsdl:output></wsdl:operation></wsdl:binding><wsdl:servicename="TestSoap"><wsdl:portbinding="tns:soapSOAP"name="soapSOAP"><soap:addresslocation="http://localhost/interface/myservice.php"/></wsdl:port></wsdl:service></wsdl:definitions>

客户端调用client.c


<?php$soap=newSoapClient('http://localhost/interface/soap.wsdl');echo$soap->Add(1,2);?>

以上是我从别人博客里摘抄下来的,启动运行了,得到结果3,没问题,后面我在客户端里加上echo$soap->HelloWorld();结果这句话报错,找了好久,请高手帮忙,终于找到问题所在,原来是要把wsdl缓存给关闭,这个在调试的时候最后要关闭,真正做好了,不用修改了就可以把wsdl缓存打开。在php.ini中找到soap.wsdl_cache_enabled,默认是打开的,将其注释掉即可,最后重启web服务器。

wsdl文件的生成可以通过ZendStudioforEclipse软件生成,步骤如下:

第一步:新建工程

点击file->new->phpproject,输入文件名,和服务器的目录一致,我用的apache,要使用的.php文件存放在/usr/local/apache/htdocs/interface目录下,这里就将文件名设为interface。

第二步:新建.php文件

点击file->new->PHPFile,输入文件名(myservice.php),接着输入源代码,记得要给每个函数加上注释,这个通过在左窗口右击对应的函数,选择source即可自动生成。在左边窗口中右击myservice.php选择export

第三步:生成wsdl文件

在browse中选择interface,输入要生成的wsdl文件名,如soap。

最后:修改wsdl中的变量类型

这样就ok啦。



二、不用wsdl文件

服务器端

<?php

classservice

{

	publicfunctionHelloWorld()

	{

		return"Hello";

	}

	publicfunctionAdd($a,$b)

	{

		return$a+$b;

	}

}

$server=newSoapServer(null,array('uri'=>"abcd"));

$server->setClass("service");

$server->handle();

?>

客户端


<?php

try{

$soap=newSoapClient(null,array("location"=>"http://localhost/interface/soap.php","uri"=>"abcd","style"=>SOAP_RPC,"use"=>SOAP_ENCODED));

echo$soap->Add(1,2);}

catch(Exction$e)

{echoprint_r($e->getMessage(),true);}

?>

这种比较重要,当外网和外网服务器直接访问,比如:通过自己的电脑访问我带3G网卡的板子时,就必须使用非wsdl方式,在wsdl方式中<soap:addresslocation="http://localhost/interface/myservice.php"/>通要填写板子的ip,但是3G网卡的ip是动态变化的,这样就很难通过第一种方式实现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐