1. 程式人生 > >php soap例項講解

php soap例項講解

一,什麼是soap,什麼是wsdl,為什麼要用他們

SOAP是基於XML和HTTP通訊協議,xml各種平臺,各種語言都支援的一個種語言。http呢它得到了所有的因特網瀏覽器及伺服器的支援。

WSDL 指網路服務描述語言 (Web Services Description Language),是一種使用 XML 編寫的文件。這種文件可描述某個 Web service。它可規定服務的位置,以及此服務提供的操作。

我是做php的,你是java的,他是做.net,如果我們三個之間要進行通訊,要進行資料交換,怎麼辦呢?我們需要一個能和我們都能通訊的工具。soap,wsdl被創造出來,使得執行在不同的作業系統並使用不同的技術和程式語言的應用程式可以互相進行通訊。

二,例項

如果php要使用soap的話,通常做法是,添加了一下php的soap模組,在php.ini裡面加上soap.so,下面介紹一個不要新增soap.so檔案,也可以實現soap的方法

nusoap是php寫的一個功能檔案,包涵進來就可以用了,網上很多自己去搜一下吧。

1,不使用wsdl

a,服務端helloworld2.php

檢視複製列印?
  1. <?php  
  2. //包函nusoap.php
  3. require_once('./lib/nusoap.php');  
  4. //建立服務端
  5. $server = new soap_server;  
  6. //定義客戶端呼叫方法
  7. $server->register('hello'
    );  
  8. //呼叫方法以及引數
  9. function hello($name) {  
  10.  return'Hello, ' . $name;  
  11. }  
  12. $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';  
  13. $server->service($HTTP_RAW_POST_DATA);  
  14. ?>  

b,客戶端hello.php

檢視複製列印?
  1. <?php  
  2. //包函nusoap.php
  3. require_once('./lib/nusoap.php');  
  4. //新建一個soap客戶端,呼叫服務端提供的wsdl
  5. //$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);
  6. $client = new soapclient('http://localhost/test/helloworld2.php');  
  7. //檢視一下是不是報錯
  8. $err = $client->getError();  
  9. if ($err) {  
  10.  //顯示錯誤
  11.  echo'<h2>Constructor error</h2><pre>' . $err . '</pre>';  
  12. }  
  13. //呼叫服務端的方法
  14. $result = $client->call('hello'array('person' => "this is a test"));  
  15. echo'<h2>Result</h2><pre>';  
  16. print_r($result);  
  17. echo'</pre>';  
  18. ?>  

2,使用wsld

a,伺服器端

檢視複製列印?
  1. <?php  
  2. //包函nusoap.php
  3. require_once('./lib/nusoap.php');  
  4. //新建一個soap服務
  5. $server = new soap_server();  
  6. //初始化支援wsdl
  7. $server->configureWSDL('hellowsdl2''urn:hellowsdl2');  
  8. //定義資料結構來接收資料
  9. $server->wsdl->addComplexType(  
  10.  'Person',  
  11.  'complexType',  
  12.  'struct',  
  13.  'all',  
  14.  '',  
  15.  array(  
  16.  'firstname' => array('name' => 'firstname''type' => 'xsd:string'),//後面的type定義資料的型別,這個是string
  17.  'age' => array('name' => 'age''type' => 'xsd:int'),//後面的type定義資料的型別,這個是int
  18.  'gender' => array('name' => 'gender''type' => 'xsd:string')//後面的type定義資料的型別,這個是string
  19.  )  
  20. );  
  21. $server->wsdl->addComplexType(  
  22.  'SweepstakesGreeting',  
  23.  'complexType',  
  24.  'struct',  
  25.  'all',  
  26.  '',  
  27.  array(  
  28.  'greeting' => array('name' => 'greeting''type' => 'xsd:string'),  
  29.  'winner' => array('name' => 'winner''type' => 'xsd:string')  
  30.  )  
  31. );  
  32. //伺服器定義的soap呼叫方法
  33. $server->register('hello',                    // 方法名字hello,方法就在下面
  34.  array('person' => 'tns:Person'),          // 客戶端傳來的變數
  35.  array('return' => 'tns:SweepstakesGreeting'),    //返回引數
  36.  'urn:hellowsdl2',                         // soap名
  37.  'urn:hellowsdl2#hello',                   // soap的方法名
  38.  'rpc',                                    // 使用的方式
  39.  'encoded',                                // 編碼
  40.  'test'// 存檔
  41. );  
  42. //定義上面註冊過的函式hello
  43. function hello($person) {  
  44.  $greeting = 'Hello, ' . $person['firstname'] .  
  45.  '. It is nice to meet a ' . $person['age'] .  
  46.  ' year old ' . $person['gender'] . '.';  
  47.  $winner =  'Scott';  
  48. //要返回的資料
  49.  returnarray(  
  50.  'greeting' => $greeting,  
  51.  'winner' => $winner
  52.  );  
  53. }  
  54. // 請求時(試圖)呼叫服務
  55. $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';  
  56. $server->service($HTTP_RAW_POST_DATA);  
  57. ?>  

b,客戶端

檢視複製列印?
  1. <?php  
  2. //包函nusoap.php
  3. require_once('./lib/nusoap.php');  
  4. //新建一個soap客戶端,呼叫服務端提供的wsdl
  5. //$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);
  6. $client = new soapclient('http://localhost/test/helloworld2.php');  
  7. //檢視一下是不是報錯
  8. $err = $client->getError();  
  9. if ($err) {  
  10.  //顯示錯誤
  11.  echo'<h2>Constructor error</h2><pre>' . $err . '</pre>';  
  12. }  
  13. //要向服務端要傳的引數
  14. $person = array('firstname' => 'Willi''age' => 22, 'gender' => 'male');  
  15. //呼叫服務端的方法
  16. $result = $client->call('hello'array('person' => $person));  
  17. //錯誤稽核
  18. if ($client->fault) {  
  19.  echo'<h2>Fault</h2><pre>';  
  20.  print_r($result);  
  21.  echo'</pre>';  
  22. else {  
  23.  $err = $client->getError();  
  24.  if ($err) {  
  25.  echo'<h2>Error</h2><pre>' . $err . '</pre>';  
  26.  } else {  
  27.  echo'<h2>Result</h2><pre>';  
  28.  print_r($result);  
  29.  echo'</pre>';  
  30.  }  
  31. }  
  32. //顯示請求資訊
  33. echo'<h2>Request</h2>';  
  34. echo'<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';  
  35. //顯示返回資訊
  36. echo'<h2>Response</h2>';  
  37. echo'<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';  
  38. //顯示除錯資訊
  39. echo'<h2>Debug</h2>';  
  40. echo'<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';  
  41. ?>  

上面二個例子不管是客戶端,還是伺服器端,都是用php寫的,你可以試著用多種語言來寫,來測試一下。不管你是用php的模組,還是用nusoap,裡面具體方法就不在這多說了,手冊裡面都有。