jsonrpc php使用,php实现的一个简单jsonrpc框架实例
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框架实例相关推荐
- Java Tread多线程(0)一个简单的多线程实例
作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...
- 递归算法(python),汉诺塔问题,斐波那契数列,一个简单的递归实例,用递归实现阶乘,用递归查看目录及文件
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请 ...
- Qt5.9一个简单的多线程实例(类QThread)(第一种方法)
Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...
- 《ANSYS Workbench 14有限元分析自学手册》——1.7 一个简单的分析实例
本节书摘来自异步社区<ANSYS Workbench 14有限元分析自学手册>一书中的第1章,第1.7节,作者: 吕建国 , 康士廷 更多章节内容可以访问云栖社区"异步社区&qu ...
- 一个简单的HTML实例
一个简单的HTML实例 适合新手的一个简单的HTML实例 <!DOCTYPE html> <html lang="zh"> <head>< ...
- 函数式编程中的战斗机(二) --运用elm语言MUV设计模式做一个简单的应用实例
@函数式编程中的战斗机(二) -运用elm语言MUV设计模式做一个简单的应用实例 1 elm语言设计模式的特点 1.1 面向对象设计模式的特点 每种编程语言都有其独特的语法和优缺点,从而导致与众不同的 ...
- $python爬虫系列(1)——一个简单的爬虫实例
本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片. 1. 概述 本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片.下载图片的步骤如下: 获取网页html文本内容: 分析html ...
- Django学习笔记2:一个简单的开发实例
Technorati 标签: Python,Django 目标:通过开发一个简单的Todo管理应用,熟悉Django的基本概念.和使用. 运行环境 Windows Vista + Python 2.7 ...
- VS2019 Xamarin 零基础开发一个简单的App实例
从前设备的延期密码一直用的是桌面程序生成的,看到C#也可以开发App,熟悉了一下,做了一个简单的应用,分享给大家: 1.VS2019没有安装移动开发组件的,先安装上: 2.创建新项目: 选择空白应用和 ...
最新文章
- 爬虫之常用数据解析方法
- 正则表达式(overall)
- AI:2020年6月21日北京智源大会演讲分享之14:50-15:15穗志方教授《从语言到知识——构建语言智能的基石》
- [CODEVS 1087] 麦森数
- 干活|常见WAF拦截页面总结
- 牛客14605 画三角
- 2019年程序员薪酬报告:平均年薪超70万!40岁后,这类人不“保值”了
- 联想拯救者y7000加内存条_关于2020款联想拯救者Y7000、R7000和Y7000P,r7000p选哪个好?看这里就对了...
- 《图解HTTP》读书笔记(二:各种协议与HTTP协议之间的关系)
- UE4官方插件下载地址,完全免费
- excel单元格使用公式进行币种自动转换,亿,万,元
- 泊松分布–计算概率分布的公式
- 实践对比google和bing搜索哪个更优
- LC-恢复二叉搜索树(JavaScript实现)
- python expend_Python序列化proto中repeated修饰的数据
- 手把手系列!大规模预训练语言模型
- C#读取Excel数据在CAD上展图
- Python处理视频文件的实用姿势
- # android移动开发——第十三章——个人理财通案例(Eclipse版)
- 百度开放平台的第三方开发步骤详解
热门文章
- 毕业设计——第三章 开发方法及系统实现(6)(完结)
- FreeBSD NetBSD OpenBSD DragonFlyBSD 操作系统
- linux到windows的ssh,ssh如何使用pxsh从linux到windows
- 打造最快的Hash表
- Mosh--mysql 学习笔记(1)
- 【鲁棒控制】平面2R型机器人的鲁棒逆推跟踪控制(matlab实现)
- c语言 进程调度 短作业,帮忙编写一个操作系统中进程调度的短作业优先算发的程序,感谢!该怎么解决...
- Java中IDEA,Springboot实现手机获取验证码和倒计时
- php更改二维数组的键,学习猿地-php如何修改二维数组的键名
- cas云计算机管理平台添加加密锁,CAS云计算管理平台安装手册.docx