|
發表者 |
討論內容 |
冷日 (冷日) |
發表時間:2010/10/28 13:04 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [轉貼]php soap实例讲解
- PHP技巧:php soap實例講解
發佈日期:2010-10-12 09:55 來源:中國建站
我要投稿SOAP是基於XML和HTTP通信協議,xml各種平台,各種語言都支持的一個種語言。http呢它得到了所有的因特網瀏覽器及服務器的支持。
一,什麼是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
//包涵nusoap.php
require_once('./lib/nusoap.php');
//創建服務端
$server = new soap_server;
//定義客戶端調用方法
$server->register('hello');
//調用方法以及參數
function hello($name) {
return 'Hello, ' . $name;
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
b,客戶端hello.php
//包涵nusoap.php
require_once('./lib/nusoap.php');
//新建一個soap客戶端,調用服務端提供的wsdl
//$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);
$client = new soapclient('http://localhost/test/helloworld2.php');
//查看一下是不是報錯
$err = $client->getError();
if ($err) {
//顯示錯誤
echo '
Constructor error
' . $err . '
';
}
//調用服務端的方法
$result = $client->call('hello', array('person' => "this is a test"));
echo '
Result
';
print_r($result);
echo '
';
?>
2,使用wsld
a,服務器端
//包涵nusoap.php
require_once('./lib/nusoap.php');
//新建一個soap服務
$server = new soap_server();
//初始化支持wsdl
$server->configureWSDL('hellowsdl2', 'urn:hellowsdl2');
//定義數據結構來接收數據
$server->wsdl->addComplexType(
'Person',
'complexType',
'struct',
'all',
'',
array(
'firstname' => array('name' => 'firstname', 'type' => 'xsd:string'),//後面的type定義數據的類型,這個是string
'age' => array('name' => 'age', 'type' => 'xsd:int'),//後面的type定義數據的類型,這個是int
'gender' => array('name' => 'gender', 'type' => 'xsd:string')//後面的type定義數據的類型,這個是string
)
);
$server->wsdl->addComplexType(
'SweepstakesGreeting',
'complexType',
'struct',
'all',
'',
array(
'greeting' => array('name' => 'greeting', 'type' => 'xsd:string'),
'winner' => array('name' => 'winner', 'type' => 'xsd:string')
)
);
//服務器定義的soap調用方法
$server->register('hello', // 方法名字hello,方法就在下面
array('person' => 'tns:Person'), // 客戶端傳來的變量
array('return' => 'tns:SweepstakesGreeting'), //返回參數
'urn:hellowsdl2', // soap名
'urn:hellowsdl2#hello', // soap的方法名
'rpc', // 使用的方式
'encoded', // 編碼
'test' // 存檔
);
//定義上面註冊過的函數hello
function hello($person) {
$greeting = 'Hello, ' . $person['firstname'] .
'. It is nice to meet a ' . $person['age'] .
' year old ' . $person['gender'] . '.';
$winner = 'Scott';
//要返回的數據
return array(
'greeting' => $greeting,
'winner' => $winner
);
}
// 請求時(試圖)調用服務
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
b,客戶端
//包涵nusoap.php
require_once('./lib/nusoap.php');
//新建一個soap客戶端,調用服務端提供的wsdl
//$client = new soapclient('http://localhost/test/hellowsdl2.php?wsdl', true);
$client = new soapclient('http://localhost/test/helloworld2.php');
//查看一下是不是報錯
$err = $client->getError();
if ($err) {
//顯示錯誤
echo '
Constructor error
' . $err . '
';
}
//要向服務端要傳的參數
$person = array('firstname' => 'Willi', 'age' => 22, 'gender' => 'male');
//調用服務端的方法
$result = $client->call('hello', array('person' => $person));
//錯誤審核
if ($client->fault) {
echo '
Fault
';
print_r($result);
echo '
';
} else {
$err = $client->getError();
if ($err) {
echo '
Error
' . $err . '
';
} else {
echo '
Result
';
print_r($result);
echo '
';
}
}
//顯示請求信息
echo '
Request
';
echo '
' . htmlspecialchars($client->request, ENT_QUOTES) . '
';
//顯示返回信息
echo '
Response
';
echo '
' . htmlspecialchars($client->response, ENT_QUOTES) . '
';
//顯示調試信息
echo '
Debug
';
echo '
' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '
';
?>
上面二個例子不管是客戶端,還是服務器端,都是用php寫的,你可以試著用多種語言來寫,來測試一下。不管你是用php的模塊,還是用nusoap,裡面具體方法就不在這多說了,手冊裡面都有。
SOAP在這裡就不用介紹了, 這裡只是簡單的實現一個SOAP的實例, 不多說 ,看代碼吧。 soap分為server和client, 我們要使client去調用server的代碼. 首先看server短的代碼:
這個是server端的代碼: server.php
//聲明一個函數add() ,並返回它的值
function add($a,$b){
return $a+$b;
}
//實例化一個SoapServer對像, 並將add函數註冊成為其方法
$server = new SoapServer(null,array('uri'=>'http://localhost/')); //指定server端代碼的URI(資源標誌符)
$server->addFunction("add");
$server->handle();
?>
然後使用client端的代碼來調用server端的代碼: client的代碼也很簡單: 如下:
這個是client端的代碼 client.php
//建立一個參數數組,存儲要訪問的提供soap服務的計算機的地址與程序
$arrOptions=array(
'uri'=>'http://localhost/',
'location'=>'http://localhost/soap/server.php', //注意: 這個location指定的是server端代碼在服務器中的具體位置, 我的是在本地根目錄下的soap目錄中,
'trace'=>true,
);
$soapObject = new SoapClient(null,$arrOptions); //實例化客戶端對像
echo $soapObject->add(20,30); //調用服務器端的函數add並返回值50
?>
ok, 結束了 !
原文出處:PHP技巧:php soap实例讲解 - 新风IT教育网
|
|
討論串
-
[轉貼]PHP and Web Services 學習筆記 (冷日 (冷日), 2010/10/18 12:48)
-
[轉貼]實戰WebService I: XML-PRC篇(基於php) (冷日 (冷日), 2010/10/18 12:55)
-
[轉貼]實戰WebService II: SOAP篇(基於php) (冷日 (冷日), 2010/10/18 12:58)
-
[轉貼]實戰WebService III: REST篇(基於php) (冷日 (冷日), 2010/10/18 13:00)
-
[轉貼]使用php提供Web service (冷日 (冷日), 2010/10/18 13:04)
-
[轉貼]soap 之 nusoap 的使用 (冷日 (冷日), 2010/10/28 9:16)
-
[轉貼]使用nusoap建立web service-範例 (冷日 (冷日), 2010/10/28 9:23)
- »
[轉貼]php soap实例讲解 (冷日 (冷日), 2010/10/28 13:04)
-
[轉貼]NuSOAP的使用说明 (冷日 (冷日), 2010/10/28 13:08)
-
[轉貼]NuSOAP教程 - PHP教程 (冷日 (冷日), 2010/10/28 13:11)
|