注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

阿飘的博客

十里平湖霜满天 寸寸青丝愁华年

 
 
 

日志

 
 

PHP中的Soap Functions初步学习  

2009-04-10 10:28:37|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1 预定义类
SoapClient
SoapFault
SoapHeader (low level)
SoapParam (low level)
SoapServer
SoapVar (low level)

2 SOAP 服务在 PHP 中的工作方式
2.1 首先,创建一个Soap Server。

$server = new SoapServer($wsdl [, $options]);
其中,$wsdl 是描述托管服务的 Web 服务描述语言 (WSDL) 文档的位置;$options 是一组键/值对,其中包含了在创建服务时需要考虑的所有设置选项。这些选项包括:
encoding:用于该 SOAP 服务的字符编码(即字符串 ISO-8859-1)。
actor:该 SOAP 服务的角色 URI。
classmap:将 WSDL 数据类型映射到 PHP 中的类名的一组键/值对本身。如果使用该选项,PHP 将根据 WSDL 中定义的类型将这些类呈现给连接客户端。

例:使用名为 bookman.wsdl 的 WSDL 文档创建一个使用 SOAP v1.2 协议的 SOAP 服务。

$server = new SoapServer(“bookman.wsdl”, array(‘soap_version’ => SOAP_1_2));

2.2 下一步,创建服务方法。

function f1($a, $b) { … }
function f2($a, $b) { … }

注册可以写成:
$server->addFunction(‘f1’);
$server->addFunction(‘f2’);
或者,
$server->addFunction(array(‘f1’, ‘f2’));
或者,
$server->addFunction(SOAP_FUNCTIONS_ALL);

也可以以面向对象的方法:(推荐这种方法!)
class functions {
public function f1($a, $b) { … }
public function f2($a, $b) { … }
}
$server->setClass(”functions”);

要完成SOAP服务器,还必须使用handle()函数开始处理从连接的 SOAP 客户端传入的请求。完整示例:
class functions {
public function f1($a, $b) { … }
public function f2($a, $b) { … }
}
$server = new SoapServer(“bookman.wsdl”, array(‘soap_version’ => SOAP_1_2));
$server->setClass(”functions”);
$server->handle();

2.3 错误报告:

public function div($a, $b) {
if($b == 0) {
throw new SoapFault(-1, “Cannot divide by zero!”); // 不然要SoapFault这个类干啥
}
return $a / $b;
}

2.4 上面还有一个WSDL的问题没解决,如何生成一个WSDL文档呢?使用Zend Studio的做法如下:
要正确使用元数据注释。比如:
/**
* Add two integers together
*
* @param integer $a The first integer of the addition
* @param integer $b The second integer of the addition
* @return integer The sum of the provided integers
*/
public function add($a, $b) {
return $a + $b;
}
然后使用Tools菜单下的WSDL生成器就可以了。当然必须将WSDL文档放在服务器能够访问的位置。(那还用说,呵呵)

2.5 用PHP创建SOAP客户端,以使用SOAP服务

$client = new SoapClient($wsdl [, $options]);

$wsdl 参数是要访问服务的 WSDL 文档的位置,可选参数 $options 是配置客户端连接的一组键/值对。包括以下一些可用选项:

soap_version:要使用的 SOAP 协议版本,其值为常量 SOAP_1_1 或 SOAP_1_2
login:如果在 SOAP 服务器上使用 HTTP 身份验证,这是要使用的登录名
password:如果在 SOAP 服务器上使用 HTTP 身份验证,这是要使用的密码
proxy_host:如果通过代理服务器连接,这是服务器的地址
proxy_port:如果通过代理服务器连接,这是代理监听的端口
proxy_login:如果通过代理服务器连接,这是登录时使用的用户名
proxy_password:如果通过代理服务器连接,这是登录时使用的密码
local_cert:如果连接到一个通过安全 HTTP (https) 通信的 SOAP 服务器,这是本地认证文件的位置
passphrase:与 local_cert 结合使用,以提供认证文件的密码短语(如果有)
compression:如果设置为 true,PHP 将尝试使用压缩的 HTTP 请求与 SOAP 服务器通信
classmap:将 WSDL 数据类型映射到 PHP 类以便在客户端使用的一组键/值对

如果PHP中的SOAP客户端通过指定的WSDL文档实例化,就可以使用返回的客户端对象调用在 SOAP 服务器上公开的方法,就好像它们是自带 PHP 调用,并处理任何可能作为原生 PHP 异常发生的 SOAP 错误。
示例:

$client = new SoapClient(“http://www.example.com/math.wsdl”);
try {
$result = $client->div(10,rand(0,5); // will cause a Soap Fault if divide by zero
print “The answer is: $result”;
} catch(SoapFault $e) {
print “Sorry an error was caught executing your request: {$e->getMessage()}”;
}

2.6 一些说明
如果在创建SOAP服务器端和客户端的时候,传入的WSDL文档URI为NULL,则工作在non-Wsdl方式下。
工作在non-Wsdl方式下的时候,server端构造函数中的option参数需指定uri(只作xml名字空间用,和真实uri无关)client的option参数需指定uri(解释同前)和location(server端真实url)参数。


两个小例子

实例一:很简单,远程调用一个函数,返回字符串。
服务器端文件server.php:
<?php
$soap = new SoapServer(null,array('uri'=>"http://test-uri/"));
$soap->addFunction('say');                                    //添加输出函数
$soap->addFunction(SOAP_FUNCTIONS_ALL);    //不要忘了这个
$soap->handle();                                                    //注意


function say($sth){
    return $sth;
}

?>

客户端文件client.php:
<?
try {
    $client = new SoapClient(null,
        array('location' =>"{your url}/server.php",'uri' => "http://test-uri/")
    );
    echo $client->say("hello world");
} catch (SoapFault $fault){
    echo "Error: ",$fault->faultcode,", string: ",$fault->faultstring;
}
?>


实例二:
服务器端文件server.php:
<?php
$classmap = array();

//注意和实例一的不同
$soap = new SoapServer(null,array('uri'=>"http://test-uri/", "classmap" => $classmap));
$soap->setClass('Myclass');
$soap->handle();

class Myclass {
    function say($someword){
        return $someword;
    }
}
?>

客户端文件client.php:
<?
try {
        $client = new SoapClient(null, array('location' =>
              "http://www.easeyoo.cn/test/test2.php", 'uri' => "http://test-uri/")
        );
    var_dump($client);
    echo $client->say("hello world");
} catch (SoapFault $fault){
        echo "Error: ",$fault->faultcode,", string: ",$fault->faultstring;
}


    以上连个例子在php5.2.4测试通过,实现在客户端输出"hello world"。

  评论这张
 
阅读(454)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017