使用XMLRPC搭建WebService服务器

1、XMLRPC概念

xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。一个rpc系统,必然包括2个部分:
1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;
2.rpc server,用于响应rpcclient的请求,执行方法,并回送方法执行结果。RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。

2、搭建RPC服务端

首先定义服务器中运行的方法,然后创建xml rpc对象,注册两个方法,获取从客户端传来的数据,服务器传过来的数据是一个xml请求数据,最后调用服务器中的方法,返回的数据格式也是xml数据格式。

<?php
//定义可以被访问的方法
function hello(){
    return 'hello world!';
}

//rpc server在调用函数时调用的参数是
// array(0=>'函数名',1=>array(实参1,实参2,实参3....),2=>NULL)
function sum($method,$args,$extra){
    return array_sum($args);
}

//创建xmlrpc Server
$server = xmlrpc_server_create();
xmlrpc_server_register_method($server, 'hello', 'hello');
xmlrpc_server_register_method($server, 'sum', 'sum');

//收取请求
$request = $HTTP_RAW_POST_DATA;

//调用方法
$response = xmlrpc_server_call_method($server, $request, null);

//输出数据
header('Content-type:text/xml;charset=utf-8');
echo $response;

//销毁xmlrpc Server资源
xmlrpc_server_destroy($server);
?>

3、搭建RPC客户端

首先定义了一个类,名为RpcClient,类中主要有3个方法,一个为__call方法,这是一个魔术方法,当调用类中不存在的方法时就会触发此模式方法,将方法名和参数包装成xml数据,然后调用类中的第二个方法__query方法,在该方法中包装一个http post请求,请求携带的数据就为__call方法中形成的xml数据,然后访问该请求。最后将获得的xml数据解析为php格式。

<?php
class RpcClient{
    private $url;//xmlrpc server的地址

    //构造方法
    public function __construct($url = ''){
        $this->url = $url;
    }

    //请求远程服务器
    private function __query($request){
        $context = stream_context_create(
            array(
                'http'=>array(
                    'method'=>'POST',
                    'header'=>'Content-type:text/xml',
                    'content'=>$request
                )
            )
        );
        return xmlrpc_decode(file_get_contents($this->url,false,$context));
    }


    //魔术方法
    public function __call($method,$params){
        $request = xmlrpc_encode_request($method, $params);
        return $this->__query($request);
    }
}
//测试调用
header('Content-type:text/html;charset=utf-8');
$client = new RpcClient('http://localhost/booledu/webservice/xmlrpc_server.php');
echo 'hello方法:'.$client->hello().'<br/>';//调用远程服务器中的hello方法
echo 'sum方法:'.$client->sum(1,2,3);//调用远程服务器中的sum方法
?>

运行结果:

这里写图片描述

posted @ 2016-11-27 14:08  SEC.VIP_网络安全服务  阅读(117)  评论(0编辑  收藏  举报