简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。
SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。或者更简单地说:SOAP 是用于访问网络服务的协议。
- SOAP 指简易对象访问协议
- SOAP 是一种通信协议
- SOAP 用于应用程序之间的通信
- SOAP 是一种用于发送消息的格式
- SOAP 被设计用来通过因特网进行通信
- SOAP 独立于平台
- SOAP 独立于语言
- SOAP 基于 XML
- SOAP 很简单并可扩展
- SOAP 允许您绕过防火墙
- SOAP 将被作为 W3C 标准来发展
为什么使用 SOAP?
对于应用程序开发来说,使程序之间进行因特网通信是很重要的。
目前的应用程序通过使用远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之间进行通信,但是 HTTP 不是为此设计的。RPC 会产生兼容性以及安全问题;防火墙和代理服务器通常会阻止此类流量。
通过 HTTP 在应用程序间通信是更好的方法,因为 HTTP 得到了所有的因特网浏览器及服务器的支持。SOAP 就是被创造出来完成这个任务的。
SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信。
PHP源码
// client.php
$serverUrl,
'uri' => $serverUrl,
'login' => 'soapuser',
'password' => 'soappwd',
'trace' => true
);
try {
$auth = array('soapuser', 'soappwd');
$client = new SOAPClient(null, $config);
$header = new SOAPHeader($serverUrl, 'auth', $auth, false, SOAP_ACTOR_NEXT);
$client->__setSoapHeaders(array($header));
$revstring = $client->revstring('123456');
$strtolink = $client->__soapCall('strtolink', array('https://www.baidu.com', 'fdipzone blog', 1));
$uppcase = $client->__soapCall('uppcase', array('Hello World'));
echo $revstring . '
';
echo $strtolink . '
';
echo $uppcase . '
';
} catch (SOAPFault $e) {
echo $e->getMessage();
}
// server.php
// 服务器验证
if ($_SERVER['PHP_AUTH_USER'] != 'soapuser' || $_SERVER['PHP_AUTH_PW'] != 'soappwd') {
header('WWW-Authenticate: Basic realm="NMG Terry"');
header('HTTP/1.0 401 Unauthorized');
echo "You must enter a valid login ID and password to access this resource.\n";
exit();
}
require 'SOAPHandle.class.php';
$oHandle = new SOAPHandle;
$config = array(
'uri' => $serverUrl
);
try{
$server = new SOAPServer(null, $config);
$server->setObject($oHandle);
$server->handle();
}catch(SOAPFault $f){
echo $f->faultString;
}
// SOAPHandle.class.php
// 逻辑类处理
class SOAPHandle{
// header 驗證
public function auth($auth) {
if($auth->string[0] != 'soapuser' || $auth->string[1] != 'soappwd'){
throw new SOAPFault('Server', 'No Permission');
}
}
// 反轉字符串
public function revstring($str = '') {
return strrev($str);
}
// 字符傳轉連接
public function strtolink($str = '', $name = '', $openwin = 0) {
$name = $name == '' ? $str : $name;
$openwin_tag = $openwin == 1 ? 'target="_blank"' : '';
return sprintf('%s', $str, $openwin_tag, $name);
}
// 字符串轉大寫
public function uppcase($str) {
return strtoupper($str);
}
}