搜索
查看: 1810|回复: 4

[web] 实现JSON-RPC 2.0服务端、客户端

[复制链接]

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2017-12-15 06:56:13 | 显示全部楼层 |阅读模式
新加的功能,服务端演示:
//JSON-RPC服务端
import console;
import process;
import wsock.tcp.simpleHttpServer;
var server = wsock.tcp.simpleHttpServer("127.0.0.1",1428);

console.setTitle(
"JSON-RPC服务端器已启动",server.getUrl());

//下面的代码也适用于IIS/FastCGI环境
server.run(
   
function(response,request){
        
        
if( request.path !="/jsonrpc" ){
            response.error(404);
        }
        
        
import console;
        console.log(request.postData())
        
        
import web.rpc.jsonServer;
        
var jsonServer = web.rpc.jsonServer();
        
        
//可以定义允许客户端调用的函数
        jsonServer.hello = function(name){
            
            
/*
            第一个返回值为客户端返回值(result),
            第二个返回值为错误对象(error)
            */

            
if(!name) return null,-32602/*_JSONRPC_INVALID_PARAMS*/;
            
return "world " + name;
        }
        
        
//也可以指定允许客户端调用的其他对象
        jsonServer.aardio = {
            
            hello =
function(){
               
return "aardio.world"
            }
            
            err =
function(){
               
error("假装抛出异常试试",2)
            }   
        }

        
        jsonServer.rpc.onError =
function(err,requestData){
            
//未捕获的服务端异常会触发这个函数,客户端错误代码为 _JSONRPC_INTERNAL_ERROR
            console.log("发生错误",err,requestData)
        }
        
        
//运行服务端
        jsonServer.rpc.run();
    }
)

回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
 楼主| 发表于 2017-12-15 06:57:00 | 显示全部楼层

JSON-RPC 2.0 客户端

//JSON-RPC客户端

import console;  
import web.rpc.jsonClient;

//创建JSON-RPC 2.0客户端
var client = web.rpc.jsonClient("http://127.0.0.1:1428/jsonrpc")

//调用远程对象和函数 aardio.hello
var rep = client.aardio.hello("jacen" )
  
//返回对象的格式参考: http://www.jsonrpc.org/specification
if( rep[["result"]] ){  
    console.dump( rep.result )
}
elseif( rep[["error"]] ){
    console.dump(rep.error)
}
else {
    client.rpc.lastResponse();
}

console.pause(
true);

另外,在aardio还可以基于WebSocket协议创建 JSON-RPC 2.0服务端与客户端,
请参考aardio范例->web应用->webSocket

回复

使用道具 举报

1

主题

11

帖子

89

积分

一级会员

Rank: 2

积分
89
发表于 2017-12-15 08:40:22 | 显示全部楼层

这个功能太棒了,
有一个问题,比如我在函数内部添加:

  1. server.run(
  2.     function(response,request){
  3. var pass = "1";
  4. jsonServer.getPass = function(){
  5.                 return pass;
  6.         }
  7. jsonServer.setPass = function(str){
  8.                 pass = str;
  9.         }
  10. }
复制代码

在客户端setPass,然后getPass后,取出来的仍然是1
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
 楼主| 发表于 2017-12-15 08:45:31 | 显示全部楼层
xixijiuhao 发表于 2017-12-15 08:40
这个功能太棒了,
有一个问题,比如我在函数内部添加:
不同的请求,在不同的线程下运行,
在IIS上,还可能在不同的进程下运行,

为什么你认为他们可以共享局部变量?!!
你这种写法,实在是匪夷所思。如果按你这种思维方式,那A从北京来存个密码,B从上海请求到同一个函数,是不是就可以把他的密码拿走了?!

用户的每一次请求,你要把他理解为一个程序启动然后关闭。
请求结束就一切结束,如果你要持久化数据,请使用数据库。
回复

使用道具 举报

35

主题

66

帖子

390

积分

新手入门

积分
390
发表于 2017-12-17 21:09:41 | 显示全部楼层
这个挺好,简洁,目前想到的应用场景是多进程的程序,主程序控制子进程进行采集群发啥的.也可以用来做一个简单的网络验证.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-17 15:05 , Processed in 0.062500 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表