首頁  >  文章  >  後端開發  >  PHP 中使用 SOAP

PHP 中使用 SOAP

WBOY
WBOY原創
2016-07-30 13:29:272033瀏覽

SOAP,英文是「肥皂」的意思。但就是這個玩意在很大程度上影響了互聯網世界,前幾年瘋炒“Web服務”概念之後,SOAP就是其成就或者說“遺產”,因為 SOAP 就是迎來實現 Web 服務的。
    SOAP = Simple Object Access Protocol,簡單物件存取協定。它是一種輕量的、簡單的、基於 XML 的協議,它被設計成在 WEB 上交換結構化的和固化的資訊。 SOAP 可以和現存的許多因特網協定和格式結合使用,包括超文本傳輸協定( HTTP),簡單郵件傳輸協定(SMTP),多用途網際郵件擴充協定(MIME)。它還支援從訊息系統到遠端過程呼叫(RPC)等大量的應用程式。
    透過 SOAP 協定實現的 Web 服務,讓全世界的程式設計師所寫的類別、函數可以集合起來,建成一個龐大的函數庫,而且是語言無關的。這為軟體事業描繪了一個燦爛的發展前景,只要網路連在一起,就可以實現代碼級的邏輯共享,過去的跨進程、跨機器、跨網絡的通信問題全部都解決了,而且 http 協定是能夠穿越防火牆的(其實是防火牆一般不封鎖http協定的80端口,否則誰也別上互聯網)。
    難怪很多人都非常看好這項技術,稱其為「激動人心」。而 Web 服務實作起來又很簡單,可以簡單的基於現在網路上無數的 Web 平台來發佈。簡單的往往是最美的,Web服務就是一個現實的例子。
    PHP 中,在 php.ini 檔案中開啟了 php_soap.dll 擴充功能後,就可以支援 SOAP 了。
    在soap擴充庫中,主要包括三種物件。
    1、SoapServer
    用於建立php伺服器端頁面時定義可被呼叫的函數及回傳回應資料。建立一個SoapServer物件的語法格式如下:
    $soap = new SoapServer($wsdl, $array);
    其中,$wsdl為shoap使用得wsdl文件,wsdl 是描述Web Service的一種標準格式, 其中,$wsdl為shoap使用得wsdl文件,wsdl 是描述Web Service的一種標準格式, 其中,$wsdl為shoap使用得wsdl文件,wsdl 是描述Web Service的一種標準格式,其中若將$wsdl設定為null,則表示不使用wsdl模式。 $array是SoapServer的屬性訊息,是一個陣列。
    SoapServer物件的addFunction方法是用來宣告哪個函數可以被客戶端調用,語法格式如下:
    $soap->addFunction($function_name);
   函數名。
    SoapServer物件的handle方法用來處理使用者輸入並呼叫對應的函數,最後傳回給客戶端處理的結果。語法格式如下:
    $soap->handle([$soap_request]);
    其中,$soap是一個SoapServer物件,$soap_request是一個可選參數,用來表示使用者的請求資訊。如果不指定$soap_request,則表示伺服器將接收使用者的全部請求。
    2、SoapCliet
    用於呼叫遠端伺服器上的SoapServer頁面,並實作了對應函數的呼叫。建立一個SoapClient物件的語法格式如下:
    $soap = new SoapClient($wsdl,$array);
    其中,參數$wsdl和$array與SoapServer相同。
    建立SoapClient物件後,呼叫服務端頁面中的函數相當於呼叫了SoapClient的方法,建立語法如下:
    $soap->user_function($params);
   ,$soap->user_function($params);
   要呼叫的函數,$params 是要傳入函數的參數。
    3、SoapFault
    SoapFault用於產生soap存取過程中可能出現的錯誤。建立一個soapFault物件的語法格式如下:
    $fault = new SoapFault($faultcode,$faultstring);
    其中,$faultcode是使用者定義的錯誤代碼,$faultstring是使用者自訂的錯誤訊息。 soapFault 物件會在伺服器端頁面發生錯誤時自動生成,或透過使用者自行建立SoapFault物件時生成。對於 Soap存取時出現的錯誤,用戶端可透過捕捉SoapFalut物件來獲得對應的錯誤訊息。
    在客戶端捕獲SoapFault物件後,可以透過下面的程式碼取得錯誤代碼和錯誤訊息:
    $fault->faultcode;//錯誤代碼
    $fault->faultstring;//錯誤訊息前面建立的SoapFault物件。
    範例:
   檔案 soapfunc.php:
   
    /* 幾個供client端呼叫的函數*/
    functionverse($str);     if(strlen($str)       {
        return new SoapFault('Client','','無效字串');
     
$retval .= $str[(strlen($str)-$i)];
      }
      return $retval;
    }
   ($num1) != intval( $num1))
      {
        return new SoapFault('客戶端','','第一個數字無效');
       {
return new SoapFault('Client','','第二個數字無效');
      }
      return ($num1+$num2);
    'Y-m-d H: i :s',time());
      return $time;
    }
    }
    ?>
   然後將我們傳入的函數註冊,
      //最後的handle()用來處理接受的soap請求
      include_once('soapfunc.php');
     ); //設定時區
      $soap = new SoapServer(null, array('uri'=>"httr://test-rui"));
      $soap->addFunction('reverse'); add2numbers');
      $soap->addFunction('gettime');
      $soap->addFunction(SOAP_FUNCTIONS_ALL)); client .php 內容:
   
      error_reporting (7);
      try
      {
        $client = new SoapClient(null, array('lobcation'=>"http://localhost:8050/_my //test-uri"));
        $str="此字串將被反轉";
        $reversed = $client->reverse($str);會得到'$reversed'";
        $n1 = 20;
        $n2 = 33;
     cho "
";
        echo "如果你試$n1 + $n2, 你會得到$sum";
        echo "
";
        echo "remoye ault)
      {
        echo "故障!代碼:" . $fault->faultcode . “ 細繩:” 。 $fault->faultstring;
      }
    ?>


PHPMang) 對服務透過WSDL Web 對服務的發布。於描述Web服務的語法規範,針對每個Web服務來說起來,它是一個說明文檔,對web服務的位置、協定和介面進行了詳細的說明。包括5部分:類型、訊息、連接埠類型、綁定和服務五部分。

1 Types定義: 類型定義,獨立於語言.對應於SOAP訊息中要傳送的元素資訊的定義
2 Message: 每個web方法對應兩個message定義in和out.而message的定義包含了頭和體
3 PortType: 每個web service對應一個PortType,該PortType中又包含了對其發布的方法, operation(操作)
4 Bindings: 指定每porttype中每個操作(類別以及方法)的綁定資訊,包含input和output的訊息的格式.
5 Service: 每個web service綁定的port資訊

Web 服務除過按照前述的範例形式發布外,還可以透過WSDL 文件來發布。

範例:

要發佈的類,檔案myservice.php:
class service
{
public function HelloWorld()
{
return "Hello"; b)
{
return $a+$b;
}
}

$server=new SoapServer('TestSoap.wsdl',array('soap_version' => SOAP_1_2));

$server-> );

$server->handle();
?>

WSDL 描述文檔,文件TestSoap.wsdl:

targetNamespace="urn:TestSoap"
xmlns:typens="urn:TestSoap"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http:// schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/ "
xmlns="http://schemas.xmlsoap.org/wsdl/">






Hello




SubResponse">SubResponse">SubResponse">SubResponse">SubResponse">SubResponse">Sub











operation >




































>

呼叫程式碼,Client .php:

error_reporting(7);

$client = new SoapClient("http://localhost:8080/_myPHP5/soap/Wsdl/TestSoap.wsdl");
echo $cliclient->Hello(); echo("
");
echo $client->Add(10, 20);
?>

然而,WSDL 文件的編寫是一件很麻煩的事情,無聊又容易出錯。很多人認為那玩意兒不是人寫的,但是,如果有好的軟體工具,那玩意兒又是不需要人寫的。 Zend 公司的 ZED 5.0 系列和 Zend Studio for eclipse 6.0 原來是很好支持 WDSL 的可視化編輯和類的發布的(按照一個類文件智能生成),但 Zend studio 7.0 之後,這方面功能有所減弱。但基於 Eclipse 建構的 Zend studio 7.x,還是有一個 WSDL 的視覺化編輯器,功能也夠用,產生的 WSDL 文件與以前有細微的變化。需要程式設計師必須對 WSDL 文件裡的標籤和元素很熟悉。

附錄:關於PHP 開發Soap 的一些錯誤

1、開發的時候一定要關閉php soap 的緩存,伺服器和客戶端都需要,不然會報:

Fatal error: Uncaught SoapFault exception: [Client] Function (”test”) is not a valid method for this service in ……clien.php:5 Stack trace:

#0 [internal function]: SoapClient->__call('test', Array)
#1 D:xampphtdocsclien. php(5): SoapClient->test()
#2 {main}

關閉方法:

ini_set("soap.wsdl_cache_enabled", "0");

可以透過類似$client->__getFunctions() 等方法查看Soap 的一些資訊。

2、如果偵錯時報告不識別xml錯誤,請確保程式碼裡沒有空格等無關訊息,例如 Utf-8 編碼檔案的 BOM 頭。

作者:張慶(網眼) 西安PHP 教育培訓中心2010-7-11

來自「網眼視界」:http://blog.why100000.com
作者微博:http://t.qq.com/ zhangking
「十萬個為什麼」電腦學習網:http://www.why100000.com


以上就介紹了PHP 使用 SOAP,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn