SOAP(Simple Object Access Protocol)简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议。
它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;
SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;
SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;
SOAP绑定(binding),使用底层协议交换信息。
基本上就向服务器发送请求实现一个服务器上的函数运行,然后得到返回值。

先看一个基本的使用很简单的
这是 soap_server.php 文件  

<?php
include_once(“lib/nusoap.php”); //插入文件
$server=new soap_server();     //生成对象
$server->configureWSDL(“test_wsdl”, “”);
$server->wsdl->schemaTargetNamespace=“urn:test_wsdl”;
$server->register(“hello”, //方法名
array( “name”=>“xsd:string”, “age”=>“xsd:string”, “tele”=>“xsd:string”, ),//输入参数
array( “return”=>“xsd:string”, ),//输出参数
“urn:test_wsdl”,//名字空间
“urn:test_wsdl#hello”,//名字空间#要操作的函数名
“rpc”,//style
“encoded”,//use
“This is test.”//说明
);
//test方法实现
function hello($name,$age,$tele) {
if(
$name==“”){
return new
soap_fault(“Client”,“”,“Must supply a valid name.”);
}
return
“Hello, ” . $name.” “.$age.” “.$tele;
}
//Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA=isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA:“”;
$server->service($HTTP_RAW_POST_DATA);
?>

在你写完了以后,在浏览器里输入url,应该会看到一个页面,根据那个页面分析下,会有很大的收获,
client端要根据上面的使用
这个是soap _client.php

CODE:
<?php
include_once(“lib/nusoap.php”);  //插入文件
//设置参数数组
$para=array(
“name”=>“tech.uenu.com”,
“age”=>“500″,
“tele”=>“12345678″,
);
//生成客户端对象,注意下面的url   ?wsdl是必须加的前面为服务端的文件
$client=new soapclient(“http://localhost/nusoap/soap_server.php?WSDL”);
//呼叫/使用 那个函数,注意名字空间的区分
$return=$client->call(‘hello’,$para,“http://localhost/soap/test_wsdl”,“test_wsdl#hello”);
print_r($return);
?>

上面是一个很基本的使用

=========================================================================
下面看一个比较复杂的使用

<?php
require_once(‘lib/nusoap.php’);
//取得值返回 返回的是一个数组
function validate($userName,$randomNum)
{
    
$temp['userName'] = $userName;
    
$temp['randomNum'] =$randomNum;
     return
$temp;
}
//本想做个set一个get方法,但是这个时候发现了一个问题,以后再说
function refresh($refresh_userName,$refresh_randomNum)
{
    
$temp['userName'] = $userName;
    
$temp['randomNum'] =$randomNum;
     return
$temp;
}
     if($logout_userName==“” || $logout_userName!=“uenucom”)
     {
    
$flag = -1

)
             )
         );
//这里是注册函数
//参数一,函数名
//参数二,是这个函数接受的参数,注意指定类型
//参数三,为返回的值,不一定名字非叫return,叫其他的也可以,注意返回的类型,
//我这里是返回我自己定义的类型 tns:userInfo 如果为基本的类型为 xsd:string 这个样子
//其他的参数,只要统一就可以了,尤其是名字空间跟 soapaction
$soap->register(‘validate’,                                                                                    // method name
    
array(‘userName’ => ‘xsd:string’,‘randomNum’ => ‘xsd:string’),    // input parameters
     //array(‘return’ => ‘xsd:string’),             // output parameters    
    
array(‘return’ => ‘tns:userInfo’),    
    
‘urn:AuthorityServicewsdl’,                    // namespace
    
‘urn:AuthorityServicewsdl#validate’,        // soapaction
    
‘rpc’,                                        // style
    
‘encoded’,                                    // use
    
‘验证用户名及随机数’                        // documentation

);
$soap->register(‘refresh’,                                                                                    // method name
    
array(‘refresh_userName’ => ‘xsd:string’,‘refresh_randomNum’ => ‘xsd:string’),    // input parameters
     //array(‘return’ => ‘xsd:string’),// output parameters
    
array(‘return’ => ‘tns:userInfo’),    
    
‘urn:AuthorityServicewsdl’,                                                                            // namespace
    
‘urn:AuthorityServicewsdl#refresh’,                                                            // soapaction
    
‘rpc’,                                                                                                                    // style
    
‘encoded’,                                                                                                            // use
    
‘按时地方’                                                                                                            // documentation

);
$soap->register(‘logout’,                                                                                        // method name
    
array(‘logout_userName’ => ‘xsd:string’),                                                // input parameters
    
array(‘return’ => ‘xsd:int’),                                                                        // output parameters
    
‘urn:AuthorityServicewsdl’,                                                                            // namespace
    
‘urn:AuthorityServicewsdl#logout’,                                                            // soapaction
    
‘rpc’,                                                                                                                    // style
    
‘encoded’,                                                                                                            // use
    
‘退出登录’                                                                                                            // documentation
);
//大家可能对 $HTTP_RAW_POST_DATA 这个变量比较疑惑,我们没有定义,怎么出来的呢
//我也有这样的想法,不过我看了下手册解释是 usually is the value of $HTTP_RAW_POST_DATA
//所以大家就别管它了,就这样使用吧
$soap->service($HTTP_RAW_POST_DATA);
?>
我们现在看下 客户端的使用

 

CODE:
<?php
require_once(‘../../lib/nusoap.php’);$username = “uenucom”;
$randomnum = “d8A9″;
$params1 = array(‘userName’=>$username,‘randomNum’=>$randomnum);
$reversed = $client->call(‘validate’,$params1);//此为返回值
//echo “注册值<br>”;
print_r ($reversed);
echo
“<br>”
这个东西到底能干什么还真不清楚,我想是可以完成,2种不同语言的交接,比如 php与asp与jsp的交互
也许有人茫然了,我这里丢了一个感念,soap返回的是一个流,所有可以当作文本流来对待,
使用socket取得。

$client=new soapclient(‘http://localhost/nusoap/samples/server/AuthorityService.php?wsdl’,true);
$err = $client->getError

();

function logout($logout_userName)//注销用户名(退出登录)
{
$flag=$logout_userName

;

 

;
$refresh_username = “uenucom”;
$refresh_randomnum = “d8A9″;
$params1 = array(‘refresh_userName’=>$refresh_username,‘refresh_randomNum’=>$refresh_randomnum);
$reversed = $client->call(‘refresh’,$params1);
//echo “取得值<br>”;
print_r ($reversed);
echo
“<br>”
;
     }
return $flag

 

;
$logout_username = “uenucom”;
$params1 = array(‘logout_userName’=>$logout_username);
$reversed = $client->call(‘logout’,$params1);
echo
$reversed;
?>
这个就不用多说了,一看应该就明白了 是数组返回的我使用print_r输出了
关于这个功能,我说下我做的实验
首先我用set方法设置了下一个公共变量的值,当用get取得的时候,值为空
说明,每次是建立一个新的访问所以值没有保留
测试2,我使用cookie 设置的值,在get方法的时候,没有取得
说明:没闹明白原因
测试3,使用session   在get方法的时候,也没有取得值
说明,没闹明白
但是取得文件或者数据库连接取得值是没有问题的,也就是可以取得固定介质中的值,文件或者数据库
;
}
$soap = new soap_server();
//参数一,服务名字,也就是server文件
//参数二,名字空间
$soap->configureWSDL(‘AuthorityServicewsdl’, ‘urn:AuthorityServicewsdl’);
//参数设置空间
$soap->wsdl->schemaTargetNamespace = ‘urn:AuthorityServicewsdl’;
//上面跟原来的基本一样,但是大家注意声明的时候发生了变化
//下面是设置一个返回的数组类型
//参数一,为你自己命名的数据类型
//参数二,混合类型,不用管
//参数三。为结构体,或者数组(array)
//参数四,按照什么排序,有三个选择all(全部)|sequence(次序)|choice(选择)
//参数五,基本约束
//注意:上面5个我们不用改变
//参数6,最重要的参数,也就是我们返回的类型想对应
//返回数组下标 =>array(‘name’=>”数组下标”,’type’=>”xsd:对应的类型”)
//类型基本包括 string,int, date,boolean 这几种形式
$soap->wsdl->addComplexType(‘userInfo’,‘complexType’,‘struct’,‘all’,,
         array(
            
‘userName’ => array(‘name’=>‘userName’, ‘type’=>‘xsd:string’),
       
‘randomNum’ => array(‘name’=>‘randomNum’, ‘type’=>‘xsd:string’

相关阅读

2 回应 到 “soap 之 nusoap 的高级用法 传递数组参数”

  1. PHP SOAP 你的示例很不错 哈

  2. call(‘T.t2′,’test_wsdl’));
    print_r($ser);
    //print_r(unserialize($ser));

    ?>

回复

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2011 科创网 豫ICP备11029392号 Suffusion theme by Sayontan Sinha