簡介
SOAP 簡單對象訪問協議是交換數據的一種協議規范,是一種輕量的、簡單的、基于XML(標準通用標記語言下的一個子集)的協議,它被設計成在WEB上交換結構化的和固化的信息。
SOAP(Simple Object Access Protocol )簡單對象訪問協議是在分散或分布式的環境中交換信息的簡單的協議,是一個基于XML的協議,它包括四個部分:
- SOAP封裝(envelop),封裝定義了一個描述消息中的內容是什么,是誰發送的,誰-
應當接受并處理它以及如何處理它們的框架; - SOAP編碼規則(encoding rules),用于表示應用程序需要使用的數據類型的實例;
- SOAP RPC表示(RPC representation),表示遠程過程調用和應答的協定;
- SOAP綁定(binding),使用底層協議交換信息。
優點
- 可擴展的。SOAP 無需中斷已有的應用程序, SOAP 客戶端、 服務器和協議自身都能發展。而且SOAP 能極好地支持中間介質和層次化的體系結構。
- 簡單的。客戶端發送一個請求,調用相應的對象, 然后服務器返回結果。這些消息是XML 格式的,并且封裝成符合HTTP 協議的消息。因此,它符合任何路由器、 防火墻或代理服務器的要求。
- 完全和廠商無關。SOAP可以相對于平臺、 操作系統、 目標模型和編程語言獨立實現。另外,傳輸和語言綁定以及數據編碼的參數選擇都是由具體的實現決定的。
- 與編程語言無關。SOAP 可以使用任何語言來完成,只要客戶端發送正確SOAP 請求( 也就是說, 傳遞一個合適的參數給一個實際的遠端服務器)。SOAP 沒有對象模型,應用程序可以捆綁在任何對象模型中。
- 與平臺無關。SOAP 可以在任何操作系統中無需改動正常運行。
SOAP有兩種操作方式,NO-WSDL 與 WSDL
NO-WSDL模式:使用參數來傳遞要使用的信息
WSDL模式: 使用WSDL文件名作為參數,并從WSDL中提取服務所需的信息。(WSDL文件結構在系統迭代頻繁的時候,沒有NO-WSDL模式靈活,這里暫時不講.)
SOAP中主要用到三個類,SOAPServer,SOAPClient,SOAPFault.
簡單示例:
server.php
<?php
class soapHandle
{
public function strtolink($url = '') {
return sprintf('<a href="%s">%s</a>', $url, $url);
}
}
try {
$server = new SOAPServer(null, ['uri' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL/server.php']);
$server->setClass('soapHandle');
$server->handle();
} catch (SOAPFault $f) {
echo $f->getMessage();
}
client.php
<?php
try {
$client = new SOAPClient(null, [
'location' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL/server.php',
'uri' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL/server.php',
]);
// 直接調用
echo $client->strtolink('www.demo.com') . '<br>';
// 間接調用
echo $client->__soapCall('strtolink', ['www.demo.com']);
} catch (SOAPFault $e) {
echo $e->getMessage();
}
簡單示例升級
server.php
<?php
class SOAPHandle
{
public function auth($auth) {
if ($auth->string[0] != 'demo' || $auth->string[1] != '123456') {
throw new SOAPFault('Server', 'No Permission');
}
}
public function strtolink($str = '', $name = '', $openwin = 0) {
$name = $name == '' ? $str : $name;
$openwin_tag = $openwin == 1 ? ' target="_blank" ' : '';
return sprintf('<a href="%s" %s>%s</a>', $str, $openwin_tag, $name);
}
}
$config = array(
'uri' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL-Header/server.php'
);
$objHandle = new SOAPHandle;
// no wsdl mode
try {
$server = new SOAPServer(null, $config);
$server->setObject($objHandle );
$server->handle();
} catch (SOAPFault $f) {
echo $f->faultString;
}
client.php
<?php
$config = [
'location' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL-Header/server.php',
'uri' => 'http://127.0.0.1:8002/demo/soap/NO-WSDL-Header/server.php',
'trace' => true
];
try {
$auth = [
'demo',
'123456'
];
// no wsdl
$client = new SOAPClient(null, $config);
/*
* SoapHeader參數說明如下所示:
* 'http://tempuri.org/' namespace(命名空間可省略)
* 'MySoapHeader' SoapHeader頭的類名
* 'array(...)' 存放標識身份的字符串參數
* 'true' 是否必須處理該header
*/
$header = new SOAPHeader('http://127.0.0.1:8002/demo/soap/NO-WSDL-Header/server.php', 'auth', $auth, false, SOAP_ACTOR_NEXT);
$client->__setSoapHeaders([$header]);
$strtolink = $client->__soapCall('strtolink', [
'http://www.demo.com',
'測試網址',
1
]);
echo $strtolink . '<br>';
} catch (SOAPFault $e) {
echo $e->getMessage();
}
參考
淺談 SOAP