php soap舉例及wsdl文件的生成

 

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是動態變化的,這樣就很難通過第一種方式實現了 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章