• 分享一下我写的JSON_RPC通讯机制,仿新浪微博的API


    JSON_RPC_Client 客户端
    /**
    * @package JSON_RPC 客户端请求
    * @author fengwei
    *
    */
    class jsonRPCClient {
    /**
    * @desc Debug state
    * @var boolean
    */
    static private $debug = false;
    /**
    * @desc 应用通信的key
    * @var string
    */
    static private $key = "1.0_7413a20f00d1a1790d387822097ddae2";
    /**
    * @desc 请求服务器的地址
    * @var string
    */
    static private $url = "http://localhost/api/index.php";
    /**
    * @desc 应用的名称
    * @var string
    */
    static private $app = "tubo";

    /**
    * @desc 接口
    * @param string $api 请求的接口
    * @param array $params 参数
    */
    static public function get($api, array $params){

    if (empty($api) || !stripos($api, "/")) {
    throw new Exception(" 接口错误 : {$api} ");
    }
    $api = explode('/', $api);
    $times = time();
    $request = array(
    'model' => $api[0],
    'action' => $api[1],
    'params' => $params,
    'keys' => array(
    'app'=> self::$app,
    'key'=> self::$key,
    'times'=> $times,
    'OAuthKey'=> md5( md5( self::$app ).self::$key.$times ),
    ),
    );
    $request = json_encode($request);
    self::$debug && self::$debug.='***** Request *****'."\n".$request."\n".'***** End Of request *****'."\n\n";

    //设置HTPP请求头, POST 请求,类型JSON
    $opts = array (
    'http' => array (
    'method' => 'POST',
    'header' => 'Content-type: application/json',
    'content' => $request,
    ));

    //创建请求的流
    $context = stream_context_create($opts);
    //打开服务端链接
    if ($fp = fopen(self::$url, 'r', false, $context)) {
    $response = '';
    while($row = fgets($fp)) {
    $response.= trim($row)."\n";
    }
    self::$debug && self::$debug.='***** Server response *****'."\n".$response.'***** End of server response *****'."\n";
    echo ($response);
    $response = json_decode($response,true);
    } else {
    throw new Exception('服务端URL请求失败: '.self::$url);
    }

    // 打开调试信息
    if (self::$debug) {
    echo nl2br($debug);
    }

    return $response;
    }
    }
     
    //获取用户的信息 仿新浪微博接口
    $rseult = jsonRPCClient::get("Member/getUserInfo", array("uid"=>'6'));
    var_dump($rseult);
     
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------
    JSON_PRC_SERIVCE 服务器端 http://localhost/api/index.php
    /**
    * @desc JSON_PRC_Service
    *
    * 请求 参数格式说明
    *
    * $param 必须为json 格式
    * //验证信息
    * $param["keys"] = array(
    * 'uid'=>
    * 'app'=>
    * 'times'
    * 'OAuthKey'=>
    * )
    * $param["model"] // 请求的Model
    * $param["action"] // 请求的方法
    * //请求方法所需的参数
    * $param["param"] = array(
    * uid=>
    * username=>
    * )
    */
    class JSON_RPC_Service
    {
    /**
    * @desc 存放$_POST过来的数组
    * @var unknown_type
    */
    public $request = array();
    /**
    * @desc 允许的App应用
    * @var 数组的键值 必须为 定义常量的那个key; define('T_KEY', "xxxxx")如 T_KEY 是tubo的key
    */
    public $apps = array("T_KEY"=>"tubo");
    /**
    * @desc 存放 请求的对象
    */
    public $obj = "";

    /**
    * @desc 初始化
    */
    public function __construct()
    {
    //保存POST过来的数据
    $this -> request = json_decode(file_get_contents('php://input'),true);
    //验证通讯的key
    $this -> verifyKey();
    //调用请求的方法
    $this -> verifyMethod();
    //输出数据
    $this -> handle();
    }

    /**
    *@desc 验证App应用是否合法
    */
    public function verifyKey()
    {

    if(!in_array($this->request['keys']['app'], $this->apps)){
    $this->json_exit(array("state"=>false, "errorMsg"=>Error::getErrorByNo(Error::API_VERIFY_KEY_ERROR)));
    }

    //取得App的类型 ,如 tubo 是 T_KEY
    $this->request['keys']['key_type'] = $this->getKeyByValue($this->apps, $this->request['keys']['app']);
    $result = Tools::verifyKey($this->request['keys']);
    if(!$result){
    $this->json_exit(array("state"=>false, "errorMsg"=>Error::getErrorByNo(Error::API_VERIFY_KEY_ERROR)));
    }
    return true;
    }

    /**
    *@desc 验证 请求的对象 和方法
    */
    public function verifyMethod()
    {
    if(!file_exists($filepath = LIB ."Openapi/{$this->request['model']}.class.php")){
    $this->json_exit(array("state"=>false, "errorMsg"=>Error::getErrorByNo(Error::API_NOT_EXIEST_MODEL)));
    }

    $className = "Openapi_".$this->request['model'];
    $this->obj = new $className();

    if(!@method_exists($this->obj, $this->request['action']) && $this->request['action']{0} != '_') {
    $this->json_exit(array("state"=>false, "errorMsg"=>Error::getErrorByNo(Error::API_NOT_EXIEST_METHOD)));
    }
    return true;
    }

    /**
    * @desc 取得结果
    */
    public function handle()
    {
    $data = call_user_func_array(array($this->obj, $this->request['action']),$this->request['params']);
    $this ->json_exit($data);
    }

    /**
    * @desc 输出结果
    */
    public function json_exit($data){
    echo json_encode($data);
    exit();
    }

    public function getKeyByValue($array, $value){
    foreach($array as $k=>$v){
    if ($value == $v){
    return $k;
    }
    }
    }

    }
    //运行
    new JSON_RPC_Service();
     
     
    ---------------------------------------------------------------------------------------------------------
     
     
     
  • 相关阅读:
    arcgis中面的保存与读取显示
    ExtJs Grid分页时序号自增的实现,以及查询以后的序号的处理
    正则表达式中常用的公式
    常用的javascript日期格式化
    让toolbar.button以及formpanel中的button像个普通按钮
    extjs2.x gridpanel的数据重新加载后分页事件的一点问题
    关于C的函数指针总结
    Python各种应用库收藏
    Linux 用户(user)和用户组(group)管理概述
    linux之旅——走入Linux 世界(2)操作系统的来龙去脉
  • 原文地址:https://www.cnblogs.com/fengwei/p/2602250.html
Copyright © 2020-2023  润新知