php实现的一个简单jsonrpc框架实例json rpc 是一种以json为消息格式的远程调用服务,它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。这种远程过程调用可以使用http作为传输协议,也可以使用其它传输协议,传输的内容是json消息体。

下面我们code一套基于php的rpc框架,此框架中包含rpc的服务端server,和应用端client;

(一)PHP服务端RPCserver jsonRPCServer.php

代码如下:

class jsonRPCServer {

/**

*处理一个request类,这个类中绑定了一些请求参数

* @param object $object

* @return boolean

*/

public static function handle($object) {

// 判断是否是一个rpc json请求

if ($_SERVER['REQUEST_METHOD'] != 'POST' || empty($_SERVER['CONTENT_TYPE'])

||$_SERVER['CONTENT_TYPE'] != 'application/json') {

return false;

}

// reads the input data

$request = json_decode(file_get_contents('php://input'),true);

// 执行请求类中的接口

try {

if ($result = @call_user_func_array(array($object,$request['method']),$request['params'])) {

$response = array ( 'id'=> $request['id'],'result'=> $result,'error'=> NULL );

} else {

$response = array ( 'id'=> $request['id'], 'result'=> NULL,

'error' => 'unknown method or incorrect parameters' );}

} catch (Exception $e) {

$response = array ('id' => $request['id'],'result' => NULL, 'error' =>$e->getMessage());

}

// json 格式输出

if (!empty($request['id'])) { // notifications don't want response

header('content-type: text/javascript');

echo json_encode($response);

}

return true;

}

}

(二)Rpc客户端,jsonRPCClient.php

代码如下:

/*

*/

class jsonRPCClient {

private $debug;

private $url;

// 请求id

private $id;

private $notification = false;

/**

* @param $url

* @param bool $debug

*/

public function __construct($url,$debug = false) {

// server URL

$this->url = $url;

// proxy

empty($proxy) ? $this->proxy = '' : $this->proxy = $proxy;

// debug state

empty($debug) ? $this->debug = false : $this->debug = true;

// message id

$this->id = 1;

}

/**

*

* @param boolean $notification

*/

public function setRPCNotification($notification) {

empty($notification) ? $this->notification = false : $this->notification = true;

}

/**

* @param $method

* @param $params

* @return bool

* @throws Exception

*/

public function __call($method,$params) {

// 检验request信息

if (!is_scalar($method)) {

throw new Exception('Method name has no scalar value');

}

if (is_array($params)) {

$params = array_values($params);

} else {

throw new Exception('Params must be given as array');

}

if ($this->notification) {

$currentId = NULL;

} else {

$currentId = $this->id;

}

// 拼装成一个request请求

$request = array( 'method' => $method, 'params' => $params,'id' => $currentId);

$request = json_encode($request);

$this->debug && $this->debug.='***** Request *****'."\n".$request."\n".'***** End Of request *****'."\n\n";

$opts = array ('http' => array (

'method' => 'POST',

'header' => 'Content-type: application/json',

'content' => $request

));

// 关键几部

$context = stream_context_create($opts);

if ( $result = file_get_contents($this->url, false, $context)) {

$response = json_decode($result,true);

} else {

throw new Exception('Unable to connect to '.$this->url);

}

// 输出调试信息

if ($this->debug) {

echo nl2br(($this->debug));

}

// 检验response信息

if (!$this->notification) {

// check

if ($response['id'] != $currentId) {

throw new Exception('Incorrect response id (request id: '.$currentId.', response id: '.$response['id'].')');

}

if (!is_null($response['error'])) {

throw new Exception('Request error: '.$response['error']);

}

return $response['result'];

} else {

return true;

}

}

}

?>

(三) 应用实例

(1)服务端 server.php

代码如下:

require_once 'jsonRPCServer.php';

代码如下:

// member 为测试类

require 'member.php';

// 服务端调用

$myExample = new member();

// 注入实例

jsonRPCServer::handle($myExample)

or print 'no request';

?>

(2)测试类文件,member.php

代码如下:

class member{

public function getName(){

return 'hello word ' ; // 返回字符串

}

}

(3)客户端 client.php

代码如下:

require_once 'jsonRPCClient.php';

$url = 'http://localhost/rpc/server.php';

$myExample = new jsonRPCClient($url);

// 客户端调用

try {

$name = $myExample->getName();

echo $name ;

} catch (Exception $e) {

echo nl2br($e->getMessage()).'

'."\n";

}

/php/27144.htmlwww.phpzy.comtrue/php/27144.htmlTechArticlephp实现的一个简单jsonrpc框架实例 json rpc 是一种以json为消息格式的远程调用服务,它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。...

jsonrpc php使用,php实现的一个简单jsonrpc框架实例相关推荐

  1. Java Tread多线程(0)一个简单的多线程实例

    作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...

  2. 递归算法(python),汉诺塔问题,斐波那契数列,一个简单的递归实例,用递归实现阶乘,用递归查看目录及文件

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请 ...

  3. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...

  4. 《ANSYS Workbench 14有限元分析自学手册》——1.7 一个简单的分析实例

    本节书摘来自异步社区<ANSYS Workbench 14有限元分析自学手册>一书中的第1章,第1.7节,作者: 吕建国 , 康士廷 更多章节内容可以访问云栖社区"异步社区&qu ...

  5. 一个简单的HTML实例

    一个简单的HTML实例 适合新手的一个简单的HTML实例 <!DOCTYPE html> <html lang="zh"> <head>< ...

  6. 函数式编程中的战斗机(二) --运用elm语言MUV设计模式做一个简单的应用实例

    @函数式编程中的战斗机(二) -运用elm语言MUV设计模式做一个简单的应用实例 1 elm语言设计模式的特点 1.1 面向对象设计模式的特点 每种编程语言都有其独特的语法和优缺点,从而导致与众不同的 ...

  7. $python爬虫系列(1)——一个简单的爬虫实例

    本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片. 1. 概述 本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片.下载图片的步骤如下: 获取网页html文本内容: 分析html ...

  8. Django学习笔记2:一个简单的开发实例

    Technorati 标签: Python,Django 目标:通过开发一个简单的Todo管理应用,熟悉Django的基本概念.和使用. 运行环境 Windows Vista + Python 2.7 ...

  9. VS2019 Xamarin 零基础开发一个简单的App实例

    从前设备的延期密码一直用的是桌面程序生成的,看到C#也可以开发App,熟悉了一下,做了一个简单的应用,分享给大家: 1.VS2019没有安装移动开发组件的,先安装上: 2.创建新项目: 选择空白应用和 ...

最新文章

  1. 爬虫之常用数据解析方法
  2. 正则表达式(overall)
  3. AI:2020年6月21日北京智源大会演讲分享之14:50-15:15穗志方教授《从语言到知识——构建语言智能的基石》
  4. [CODEVS 1087] 麦森数
  5. 干活|常见WAF拦截页面总结
  6. 牛客14605 画三角
  7. 2019年程序员薪酬报告:平均年薪超70万!40岁后,这类人不“保值”了
  8. 联想拯救者y7000加内存条_关于2020款联想拯救者Y7000、R7000和Y7000P,r7000p选哪个好?看这里就对了...
  9. 《图解HTTP》读书笔记(二:各种协议与HTTP协议之间的关系)
  10. UE4官方插件下载地址,完全免费
  11. excel单元格使用公式进行币种自动转换,亿,万,元
  12. 泊松分布–计算概率分布的公式
  13. 实践对比google和bing搜索哪个更优
  14. LC-恢复二叉搜索树(JavaScript实现)
  15. python expend_Python序列化proto中repeated修饰的数据
  16. 手把手系列!大规模预训练语言模型
  17. C#读取Excel数据在CAD上展图
  18. Python处理视频文件的实用姿势
  19. # android移动开发——第十三章——个人理财通案例(Eclipse版)
  20. 百度开放平台的第三方开发步骤详解

热门文章

  1. 毕业设计——第三章 开发方法及系统实现(6)(完结)
  2. FreeBSD NetBSD OpenBSD DragonFlyBSD 操作系统
  3. linux到windows的ssh,ssh如何使用pxsh从linux到windows
  4. 打造最快的Hash表
  5. Mosh--mysql 学习笔记(1)
  6. 【鲁棒控制】平面2R型机器人的鲁棒逆推跟踪控制(matlab实现)
  7. c语言 进程调度 短作业,帮忙编写一个操作系统中进程调度的短作业优先算发的程序,感谢!该怎么解决...
  8. Java中IDEA,Springboot实现手机获取验证码和倒计时
  9. php更改二维数组的键,学习猿地-php如何修改二维数组的键名
  10. cas云计算机管理平台添加加密锁,CAS云计算管理平台安装手册.docx