zoukankan      html  css  js  c++  java
  • 使用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方法
    ?>

    运行结果:

    这里写图片描述

  • 相关阅读:
    android高级UI之Draw绘制流程、Paint渲染高级应用
    android高级UI之UI绘制流程(测量布局)
    大数据JavaWeb之MySQL基础----多表&事务&DCL
    大数据JavaWeb之MySQL基础---数据库设计、备份与还原
    大数据JavaWeb之MySQL基础---约束
    大数据JavaWeb之MySQL基础---DDL&DQL
    大数据JavaWeb之MySQL基础---MySQL安装、SQL初识
    软引用示例演示与引用队列的作用分析
    Reference的四种状态转换关系分析
    【转】document.form.action,表单分向提交
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407038.html
Copyright © 2011-2022 走看看