php soap举例及wsdl文件的生成

来源:互联网 发布:mac爱奇艺flash 编辑:程序博客网 时间:2024/04/30 17:02
 

PHP 使用soap有两种方式。

一、用wsdl文件

服务器端myservice.php

<?php 
class service 
{ 
  public function HelloWorld() 
{ 
return "Hello"; 
} 
public function Add($a,$b) 
{ 
return $a+$b; 
}
} 
$server=new SoapServer('soap.wsdl',array('soap_version' => SOAP_1_2));
$server->setClass("service"); 
$server->handle(); 
?>资源描述文件,可以用工具(zend studio)生成。其实就是一个xml文件。
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions xmlns: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:schema targetNamespace="http://localhost/interface/"> <xsd:element name="HelloWorld"> <xsd:complexType> <xsd:sequence> <xsd:element name="in" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="HelloWorldResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="out" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Add"> <xsd:complexType> <xsd:sequence> <xsd:element name="in" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="AddResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="out" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </wsdl:types> <wsdl:message name="AddRequest"> <wsdl:part name="a" type="xsd:int"></wsdl:part> <wsdl:part name="b" type="xsd:int"></wsdl:part> </wsdl:message> <wsdl:message name="AddResponse"> <wsdl:part name="c" type="xsd:int"></wsdl:part> </wsdl:message> <wsdl:portType name="TestSoap"> <wsdl:operation name="Add"> <wsdl:input message="tns:AddRequest"></wsdl:input> <wsdl:output message="tns:AddResponse"></wsdl:output> </wsdl:operation> </wsdl:portType> <wsdl:binding name="soapSOAP" type="tns:TestSoap"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="Add"> <soap:operation soapAction="http://localhost/interface/Add" /> <wsdl:input> <soap:body use="literal" namespace="http://localhost/interface/" /> </wsdl:input> <wsdl:output> <soap:body use="literal" namespace="http://localhost/interface/" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="TestSoap"> <wsdl:port binding="tns:soapSOAP" name="soapSOAP"> <soap:address location="http://localhost/interface/myservice.php"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
客户端调用client.c 
<?php $soap = new SoapClient('http://localhost/interface/soap.wsdl'); echo $soap->Add(1,2); ?> 
以上是我从别人博客里摘抄下来的,启动运行了,得到结果3,没问题,后面我在客户端里加上echo $soap->HelloWorld();结果这句话报错,找了好久,请高手帮忙,终于找到问题所在,原来是要把wsdl缓存给关闭,这个在调试的时候最后要关闭,真正做好了,不用修改了就可以把wsdl缓存打开。在php.ini中找到soap.wsdl_cache_enabled,默认是打开的,将其注释掉即可,最后重启web服务器。 
wsdl文件的生成可以通过Zend Studio for Eclipse软件生成,步骤如下: 
第一步:新建工程 
 点击file->new->php project,输入文件名,和服务器的目录一致,我用的apache,要使用的.php文件存放在/usr/local/apache/htdocs/interface目录下,这里就将文件名设为interface。 
第二步:新建.php文件 
 点击file->new->PHP File,输入文件名(myservice.php),接着输入源代码,记得要给每个函数加上注释,这个通过在左窗口右击对应的函数,选择source即可自动生成。在左边窗口中右击myservice.php选择export 
第三步:生成wsdl文件 
 在browse中选择interface,输入要生成的wsdl文件名,如soap。 
最后:修改wsdl中的变量类型 
这样就ok啦。 
 

二、不用wsdl文件

服务器端

<?php 
class service 
{ 
public function HelloWorld() 
{ 
return "Hello";
} 
public function Add($a,$b)
 { 
return $a+$b;
 }
} 
$server=new SoapServer(null,array('uri' => "abcd")); 
$server->setClass("service"); 
$server->handle(); 
?> 
客户端 
<?php 
try{ 
$soap = new SoapClient(null,array( "location" => "http://localhost/interface/soap.php", "uri" => "abcd", "style" => SOAP_RPC, "use" => SOAP_ENCODED )); 
echo $soap->Add(1,2); }
catch(Exction $e)
{ echo print_r($e->getMessage(),true); }
?> 
这种比较重要,当外网和外网服务器直接访问,比如:通过自己的电脑访问我带3G网卡的板子时,就必须使用非wsdl方式,在wsdl方式中<soap:address location="http://localhost/interface/myservice.php"/> 通要填写板子的ip,但是3G网卡的ip是动态变化的,这样就很难通过第一种方式实现了 
原创粉丝点击