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

<?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

<?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 '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}

//調用服務端的方法
$result = $client->call('hello', array('person' => "this is a test"));

echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
?>

2,使用wsld

a,服務器端

<?php
//包函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,客戶端

<?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 '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
//要向服務端要傳的參數
$person = array('firstname' => 'Willi', 'age' => 22, 'gender' => 'male');

//調用服務端的方法
$result = $client->call('hello', array('person' => $person));
//錯誤審覈
if ($client->fault) {
 echo '<h2>Fault</h2><pre>';
 print_r($result);
 echo '</pre>';
} else {
 $err = $client->getError();
 if ($err) {
 echo '<h2>Error</h2><pre>' . $err . '</pre>';
 } else {
 echo '<h2>Result</h2><pre>';
 print_r($result);
 echo '</pre>';
 }
}
//顯示請求信息
echo '<h2>Request</h2>';
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
//顯示返回信息
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
//顯示調試信息
echo '<h2>Debug</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>

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

2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章