Lua JSONRPC学习笔记
JSON RPC
JSON RPC 为利用json数据格式来执行远程调用方式,
作用同xmlrpc,不过与xmlrpc相比, jsonrpc更加轻量,json更加节省数据量,更加可读性高。
官网网站:
http://www.json-rpc.org/
JSONRPC协议规范:
http://www.json-rpc.org/wiki/specification
lua实现的jsonrpc项目:
https://github.com/craigmj/json4lua
http://json.luaforge.net/
JSON
JSON为一种字符串方式数据组织的格式,以便于传输, 其语法同JAVASCRIPT对象写法(JS Object Notation)。
官网:
http://www.json.org/
lua实现的json项目:
https://github.com/craigmj/json4lua
LUA JSON 编解码
下载 json lua实现代码包, 解压后,将json文件夹放到lua path下,即lua安装目录下。
下载网址:
https://github.com/craigmj/json4lua
其中example文件夹下有演示代码 example.lua, 演示了如何将 一个 lua table编码为JSON字符串, 又如何将此字符串,恢复为LUA table。
--[[
JSON4Lua example script.
Demonstrates the simple functionality of the json module.
]]--
json = require('json') -- Object to JSON encode
test = {
one='first',two='second',three={,,}
} jsonTest = json.encode(test) print('JSON encoded test is: ' .. jsonTest) -- Now JSON decode the json string
result = json.decode(jsonTest) print ("The decoded table result:")
table.foreach(result,print)
print ("The decoded table result.three")
table.foreach(result.three, print)
LUA JSON RPC
lua json的下载安装包,已经包括 json rpc的实现, 只需要从example中测试 jsonrpc的 客户端和 服务器端例子即可。
客户端依赖 luasocket 来发起http请求。
服务器端代码经过改造, 宿主与xavante, 有连接到来时, 触发执行。
客户端:
require ("json.rpc") result, error = json.rpc.call("http://localhost:12345","echo","Test echo!")
print("echo call="..result) print("\n\n") result, error = json.rpc.call("http://localhost:12345","average", , )
print("average="..result.average)
服务器端代码:
xavante = require("xavante") wsapi = require("wsapi")
wsapi.xavante = require("wsapi.xavante")
wsapi.request = require("wsapi.request") require ('json') -- The Lua class that is to serve JSON RPC requests
local myServer = {
echo = function (msg) return msg end,
average = function(...)
local total=
local count=
for i=, table.getn(arg) do
total = total + arg[i]
count = count +
end
return { average= total/count, sum = total, n=count }
end
}
-- JSON RPC 服务器端处理主体程序
local function serve(luaClass, packReturn, req)
local postData = req.POST.post_data -- SAPI.Request.getpostdata() --[[{ "id":1, "method":"echo","params":["Hi there"]}]] -- -- @TODO Catch an error condition on decoding the data
local jsonRequest = json.decode(postData)
local jsonResponse = {}
jsonResponse.id = jsonRequest.id
local method = luaClass[ jsonRequest.method ] if not method then
jsonResponse.error = 'Method ' .. jsonRequest.method .. ' does not exist at this server.'
else
local callResult = { pcall( method, unpack( jsonRequest.params ) ) }
if callResult[] then -- Function call successfull
table.remove(callResult,)
if packReturn and table.getn(callResult)> then
jsonResponse.result = callResult
else
jsonResponse.result = unpack(callResult) -- NB: Does not support multiple argument returns
end
else
jsonResponse.error = callResult[]
end
end -- Output the result
-- TODO: How to be sure that the result and error tags are there even when they are nil in Lua?
-- Can force them by hand... ?
return json.encode( jsonResponse )
end --- WSAPI handler
-- @param wsapi_env WSAPI environment
function wsapi_handler(wsapi_env)
local headers = { ["Content-type"] = "text/plain" }
local req = wsapi.request.new(wsapi_env) local r = serve(myServer, nil, req)
print("r="..r)
headers["Content-length"] = tostring(#r) local function xmlrpc_reply(wsapienv)
coroutine.yield(r)
end return , headers, coroutine.wrap(xmlrpc_reply)
end local rules = {{ match = ".", with = wsapi.xavante.makeHandler(wsapi_handler) }}
local config = { server = {host = "*", port = }, defaultHost = { rules = rules} } xavante.HTTP(config)
xavante.start()
代码实现了, 客户端和服务通过JSONRPC调用,实现 echo 和 做平均计算的例子。
Lua JSONRPC学习笔记的更多相关文章
- lua本学习笔记功能
Lua本学习笔记功能 1. 函数返回 指定任务的主要功能是完成,在这种情况下,函数被用作调用语句.函数可以计算并返回值,在这种情况下,作为分配值表达式语句使用. 语法: funcationfunc_ ...
- GJM : Lua 语言学习笔记
Lua笔记 容易与C/C++整合 Lua所提供的机制是C所不善于的:高级语言,动态结构,简洁,易于测试和调试. Lua特有的特征: `1:可扩展性.卓越的扩展性导致了很多人将Lua用作搭建领域语言的工 ...
- LUA table学习笔记
function printT( ... ) for i,v in ipairs(...) do print(i,v) end end t1={} t2={} t3={} table.insert(t ...
- Lua 基础 -- 学习笔记
标签(空格分隔): Lua 1. Lua可以一次性给多个变量赋值 变量比赋值多,多的变量就赋值nil 变量比赋值少,多的赋值舍弃 local a, b, c = 1, 2, 3 print( a, b ...
- lua学习笔记
工作需要,上周对lua赶进度似地学习了一遍,主要参考<lua中文教程>一书,中间参考一些<lua游戏开发实践>,首先说说这两本书,后者不适合初学,里面是对一个游戏脚本系统进行粗 ...
- [转]LUA 学习笔记
Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...
- uLua学习笔记(三):Unity3D和Lua之间的相互调用
这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方 ...
- Lua 学习笔记(一)
Lua学习笔记 1.lua的优势 a.可扩张性 b.简单 c.高效率 d.和平台无关 2.注释 a.单行注释 -- b.多行注释 --[[ --]] 3.类型和 ...
- Lua学习笔记6:C++和Lua的相互调用
曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...
随机推荐
- CentOS6.4 安装nmon
安装 mkdir /usr/local/nmon cd /usr/local/nmon wget http://sourceforge.net/projects/nmon/files/nmon_lin ...
- ACM Registration system
Registration system 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 A new e-mail service "Berlandesk&q ...
- ACM: hdu 2647 Reward -拓扑排序
hdu 2647 Reward Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- not only ... but also
轉載自http://210.240.55.2/~t311/moe/engb6/b6grammar/b6notonly.htm not only ... but also ... 是「不僅‧‧‧也是‧‧ ...
- 在不知道json格式的情况下如何使用cjson进行解析
假设我们有一个json字符串,但是我们不知道这个json的组织方式,那么如何进行解析呢,下面就给一个小例子. 1.我们的json串如下: { "aStr": "aaaaa ...
- CSS样式优化
一.css代码优化作用与意义 1.减少占用网页字节.在同等条件下缩短浏览器下载css代码时间,相当于加快网页打开速度2.便于维护.简化和标准化css代码让css代码减少,便于日后维护3.让自己写的cs ...
- [LintCode] 3Sum 三数之和
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- [LintCode] Mini Twitter 迷你推特
Implement a simple twitter. Support the following method: postTweet(user_id, tweet_text). Post a twe ...
- [CareerCup] 18.4 Count Number of Two 统计数字2的个数
18.4 Write a method to count the number of 2s between 0 and n. 这道题给了我们一个整数n,让我们求[0,n]区间内所有2出现的个数,比如如 ...
- Odoo 采购单 加盖 电子公章
简单说一下思路,第一步呢是要有一个电子公章的图片,第二步就是把这张图片添加到生成的PDF文件中. 最后的效果图如下: