PHP 中使用 SOAP(1)

来源:互联网 发布:秦皇岛广电网络 编辑:程序博客网 时间:2024/06/02 15:49

    SOAP,英文是“肥皂”的意思。但就是这个玩意在很大程度上影响了互联网世界,前几年疯炒“Web服务”概念之后,SOAP就是其成就或者说“遗产”,因为 SOAP 就是迎来实现 Web 服务的。

    SOAP = Simple Object Access Protocol,简单对象访问协议。它是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。

    通过 SOAP 协议实现的 Web 服务,使全世界的程序员编写的类、函数可以集合起来,建成一个巨大的函数库,而且是语言无关的。这为软件事业描绘了一个灿烂的发展前景,只要网络连在一起,就可以实现代码级的逻辑共享,过去的跨进程、跨机器、跨网络的通信问题全部都解决了,而且 http 协议是能够穿越防火墙的(其实是防火墙一般不封锁http协议的80端口,否则谁也别上互联网)。

    难怪很多人非常看好这项技术,称其“激动人心”。而 Web 服务实现起来又很简单,可以简单的基于现在互联网上无数的 Web 平台来发布。简单的往往是最美的,Web服务就是一个现实的例子。

    PHP 中,在 php.ini 文件中开启了 php_soap.dll 扩展后,就可以支持 SOAP 了。

    在soap扩展库中,主要包括三种对象。

    1、SoapServer

    用于创建php服务器端页面时定义可被调用的函数及返回响应数据。创建一个SoapServer对象的语法格式如下:
    $soap = new SoapServer($wsdl, $array);
    其中,$wsdl为shoap使用得wsdl文件,wsdl 是描述 Web Service的一种标准格式,若将$wsdl设置为null,则表示不使用wsdl模式。$array是SoapServer的属性信息,是一个数组。
    SoapServer对象的addFunction方法是用来声明哪个函数可以被客户端调用,语法格式如下:
    $soap->addFunction($function_name);
    其中,$soap是一个SoapServer对象,$function_name是需要被调用的函数名。
    SoapServer对象的handle方法用来处理用户输入并调用相应的函数,最后返回给客户端处理的结果。语法格式如下:
    $soap->handle([$soap_request]);
    其中,$soap是一个SoapServer对象,$soap_request是一个可选参数,用来表示用户的请求信息。如果不指定$soap_request,则表示服务器将接收用户的全部请求。

    2、SoapCliet
    用于调用远程服务器上的SoapServer页面,并实现了对相应函数的调用。创建一个SoapClient对象的语法格式如下:
    $soap = new SoapClient($wsdl,$array);
    其中,参数$wsdl和$array与SoapServer相同。
    创建SoapClient对象后,调用服务端页面中的函数相当于调用了SoapClient的方法,创建语法如下:
    $soap->user_function($params);
    其中,$soap是一个SoapClient对象,user_function是服务器端要调用的函数,$params 是要传入函数的参数。

    3、SoapFault
    SoapFault用于生成soap访问过程中可能出现的错误。创建一个soapFault对象的语法格式如下:
    $fault = new SoapFault($faultcode,$faultstring);
    其中,$faultcode是用户定义的错误代码,$faultstring是用户自定义的错误信息。soapFault 对象会在服务器端页面出现错误时自动生成,或者通过用户自行创建SoapFault对象时生成。对于 Soap访问时出现的错误,客户端可通过捕捉SoapFalut对象来获得相应的错误信息。
    在客户端捕获SoapFault对象后,可以通过下面的代码获得错误代码和错误信息:
    $fault->faultcode;//错误代码
    $fault->faultstring;//错误信息
    其中,$fault是在前面创建的SoapFault对象。

    示例:

    文件 soapfunc.php:
    <?
    /* 几个供client端调用的函数 */

    function reverse($str)
    {
      $retval='';
      if(strlen($str)<1)
      {
        return new SoapFault('Client','','Invalid string');
      }
      for($i=1; $i<=strlen($str); $i++)
      {
        $retval .= $str[(strlen($str)-$i)];
      }
      return $retval;
    }

    function add2numbers($num1, $num2)
    {
      if(trim($num1) != intval($num1))
      {
        return new SoapFault('Client','','The first number is invalid');
      }
      if(trim($num2) != intval($num2))
      {
        return new SoapFault('Client','','The second number is invalid');
      }
      return ($num1+$num2);
    }

    function gettime()
    {
      $time = date('Y-m-d H:i:s',time());
      return $time;
    }
    ?>

    文件 soapclsoapserverient.php 内容:

    <?
      //先创建一个SoapServer对象实例,然后将我们要暴露的函数注册,
      //最后的handle()用来处理接受的soap请求
      include_once('soapfunc.php');

      error_reporting(7); //正式发布时,设为 0
      date_default_timezone_set('PRC'); //设置时区

      $soap = new SoapServer(null, array('uri'=>"httr://test-rui"));
      $soap->addFunction('reverse');
      $soap->addFunction('add2numbers');
      $soap->addFunction('gettime');
      $soap->addFunction(SOAP_FUNCTIONS_ALL);
      $soap->handle();
    ?>

    文件 soapclient.php 内容:

    <?
      error_reporting(7);
      try
      {
        $client = new SoapClient(null, array('location'=>"http://localhost:8080/_myPHP5/soap/soapserver.php", 'uri'=>"http://test-uri"));

        $str="This string will be reversed";
        $reversed = $client->reverse($str);
        echo "if you reverse '$str', you will get '$reversed'";

        $n1 = 20;
        $n2 = 33;
        $sum = $client->add2numbers($n1,$n2);
        echo "<br>";
        echo "if you try $n1 + $n2, you will get $sum";

        echo "<br>";
        echo "The remoye system time is: ".$client->gettime();
      }
      catch(SoapFault $fault)
      {
        echo "Fault! code:" . $fault->faultcode . " string:" . $fault->faultstring;
      }
    ?>

    作者:张庆(网眼) 西安 PHP 教育培训中心 2010-7-11
    来自“网眼视界”:http://blog.why100000.com
    作者微博:http://t.qq.com/zhangking
    “十万个为什么”电脑学习网:http://www.why100000.com