SOAP:简单对象访问协议,简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。php默认提供了专门用于soap操作的扩展库,我们只需要在php.ini中把php_soap.dll的扩展包加上即可,然后就能很方便地实现soap版本的远程过程调用。
A,不使用wsdl文件(使用方便,不需要编写繁琐的wsdl文件,定义每个属性和接口的类型返回都是件麻烦事,虽然zend工具可以提供自动生成)
服务端server.php
<?php
class libClass
{
public function Say()
{
return "ciaos";
}
public function Add($a, $b)
{
return $a + $b;
}
public function Com($s1, $s2)
{
return $s1 . $s2;
}
}
$server=new SoapServer(null,array('uri' => "abcd"));
$server->setClass("libClass");
$server->handle();
?>
客户端client.php
<?php
try{
$svc = new SoapClient(null,array(
"location" => "http://localhost/server.php",
"uri" => "abcd", //资源描述符服务器和客户端必须对应
"style" => SOAP_RPC,
"use" => SOAP_ENCODED
));
echo $svc->Say();
echo $svc->Add(3,4);
echo $svc->Com("Hello","World");
}catch(Exction $e){
echo print_r($e->getMessage(),true);
}
?>
用浏览器访问client.php,可以看到如下结果(能这么简单实现远程过程调用实在太好用了):
ciaos7HelloWorld
B,使用wsdl文件(Web Services Description Language),soap为简单对象访问协议,既然是对象,则肯定有属性和行为,这些内容就是在wsdl文件中给以描述的。
我这里没有zend for eclipse,没法简单地自动生成wsdl文件,就不做这个测试了,大致效果是一样的。
和不使用wsdl文件的区别我觉得使用wsdl文件描述的话会规范一点,跨语言调用也更容易。而且wsdl是一个标准的xml描述,给别的开发者(尽管使用语言不一样)阅读也可很快了解到你提供的对象的行为和属性。
服务端server_nusoap.php
<?php
require_once('./nusoap/lib/nusoap.php');
$srv = new soap_server;
$srv->register("Hello");
function Hello($name)
{
return "Hello " . $name;
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$srv->service($HTTP_RAW_POST_DATA);
?>
客户端client_nusoap.php
<?php
require_once('./nusoap/lib/nusoap.php');
$svc = new soapclient("http://localhost/server_nusoap.php");
echo $svc->call("Hello", array("name" => "Ciaos"));
if(NULL!=$svc->getError()){
echo " error :", htmlentities($err,ENT_QUOTES) ;
}
?>
浏览器访问客户端代码也可以看到服务调用成功。(nusoap是一个很复杂的项目,功能强大多种多样,我上面也只是一个简单的示例demo)
最后摘录一些百度百科上对SOAP优点的总结:
- SOAP是简单的,客户端发送一个请求,调用相应对象,然后服务器返回结果,这些消息是XML格式,并且封装成符合HTTP协议的消息,符合路由器防火墙和代理服务器的要求。
- SOAP可以相对平台,操作系统,目标模型和编程语言独立实现
- 和编程语言无关,soap可以用任何语言完成,只要客户端发送正确的SOAP请求。
- 与平台无关,可以在任何操作系统使用无需修改。