php实现的一个简单json rpc框架实例
发布:smiling 来源: PHP粉丝网 添加日期:2021-05-18 21:43:04 浏览: 评论:0
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' || emptyempty($_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 (!emptyempty($request['id'])) { // notifications don't want response
- header('content-type: text/javascript');
- echo json_encode($response);
- }
- return true;
- }
- }
(二)Rpc客户端,jsonRPCClient.php 代码如下:
- <?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
- emptyempty($proxy) ? $this->proxy = '' : $this->proxy = $proxy;
- // debug state
- emptyempty($debug) ? $this->debug = false : $this->debug = true;
- // message id
- $this->id = 1;
- }
- /**
- *
- * @param boolean $notification
- */
- public function setRPCNotification($notification) {
- emptyempty($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
代码如下:
- <?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()).'<br />'."\n";
- }
Tags: json rpc框架
- 上一篇:新浪微博OAuth认证和储存的主要过程详解
- 下一篇:php中使用sftp教程
相关文章
- ·淘宝API返回的json数据无法用json_decode的问题(2013-12-05)
- ·php中json_encode格式中文问题解决方法(2013-12-06)
- ·PHP JSON数据处理实例程序用法(2014-01-06)
- ·php 通过curl post发送json数据实例(2014-01-10)
- ·php json_encode()函数中文编码乱码解决方法(2014-01-16)
- ·PHP中JSON的应用方法(2014-05-19)
- ·php输出json格式数据的例子(2014-06-13)
- ·php中GBK/GB2312页面使用json_decode()中文丢失(2014-07-03)
- ·PHP JSON数据的创建和解析程序代码(2014-07-22)
- ·PHP JSONP跨域实现程序详解(2014-07-22)
- ·PHP 与 js json的通信实例(2014-08-15)
- ·PHP的json_encode使用分析说明(2014-08-27)
- ·php利用json数据实现跨域操作实例(2014-09-02)
- ·Android中的JSONObject和JSONArray解析json数据(2014-09-05)
- ·php解析JSON 数据(2014-09-05)
- ·php检测数据是否为json字符(2014-09-21)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)