XMLRPC
XMLRPC 为以http为传输协议,使用xml格式化数据来执行远程过程调用, 区别于本地过程调用, 即发生在不同主机之间。
属于分布式计算的一种简单实现,比web service简单易用。xml语言被多种语言广泛支持,是一种可扩展的标记语言,
xmlrpc被多种平台实现,以此提供的服务可以客户端和服务器端使用不同语言,
具有平台无关性,比socket发送网络字节序具有优势, 不用考虑大小端问题, 且报文内容遵循规定格式, 易于处理和阅读。
此为UseLand公司制定的一套标准,http://xmlrpc.scripting.com/default.html, 角色分服务器端和客户端,
可以被不同语言实现,
c --- http://xmlrpc-c.sourceforge.net/
lua --- https://github.com/timn/lua-xmlrpc
php --- https://github.com/gggeek/phpxmlrpc/releases/tag/2.2.2
java --- http://ws.apache.org/xmlrpc/
luaXMLRPC
luaXMLRPC是lua语言实现的一套软件包, 可以访问 和 提供 xmlrpc服务, 即服务器和客户端角色都支持。
https://github.com/timn/lua-xmlrpc
客户端主要实现功能, 将lua table数据转换为 XML RPC message,
然后通过luaSocket库以http协议发送出去,
对于响应回来的XML RPC message 使用XML解析器 luaExpat 反向解析为 lua table,和返回值。
The
http.lua
file implements a simple stand-alone
client based on LuaSocket 2.0.2. The
following function is provided:
call (url, method [,
params])
- Execute the call to
method
at
locationurl
with the
givenparams
(if any).
Themethod
andparams
parameters
will be just passed to clEncode function.
The result is the same as clDecode function:
a boolean indicating whether the call was successful or not, followed by the
response value (if successful) or by the faultString and
the faultCode (if the call fails).
服务器端, CGILUA接收到XML RPC message后, 使用luaExpat解析为lua table, 后调用相应方法,
将执行结果组装成XML RPC response message, 发送回客户端。
服务器端注册方法接口:
srvMethods (tab_or_func)
Register the methods
on the server. The parameter can be a table or a dispatching function. If
a table is given it can have one level of objects with the
corresponding methods. If a function is given, it will
replace the dispatcher.
luaXMLRPC提供的一些库函数,参见来自下载包帮助文档:
Library functions
The
xmlrpc.lua
file implements the functions that
encode and decode XML-RPC messages and transform data types between the Lua
and XML-RPC. The functions are:
clEncode (method_name [, params])
=> method_call
- Build a XML-RPC document containing
amethodCall
element. It receives a string with the
method‘s name and an optional list of parameters. The result is a string
containing the XML-RPC document.
clDecode (method_response) =>
ok, results
- Disassemble the server response into a Lua object. It receives a string
containing the XML-RPC document representing
themethodResponse
element. The result is a boolean
indicating wether the call was successful or not followed by the resulting
objects (typically a methodResponse has only one value so only one Lua
object will be returned). In case of error
thefalse
value is followed by the
XMLRPC faultString and the faultCode. This
values are extracted from thefault
element.
srvDecode (method_call) =>
method_name, list_params
- Disassemble the client request into a method‘s name and a table with the
list of parameters. It receives a string containing the XML-RPC document
representing themethodCall
element. The result is a
string with the name of the method to be called and a Lua table with the
arguments to the call.
srvEncode (object, is_fault) =>
method_response
- Build a XML-RPC document containing
amethodResponse
element. It receives a Lua object (a
number, a string, a table, a "created typed value" etc.) with the return
value of the call. The result is a string containing the XML-RPC document.
Note that XML-RPC defines that a response only
returns one value so a Lua function that returns more
than one value has to pack them into a table to guarantee
that all of them will be returned. The second parameter
(is_fault
) can be used to force
afault
element to be generated instead of
aparams
. In this case, the Lua object must be a table
with the
membersfaultCode
andfaultString
.
srvMethods
(tab_or_func)
- Register the methods on the server. The parameter can be a table or a
dispatching function. If a table is given it can have one
level of objects with the corresponding methods. If
a function is given, it will replace the dispatcher.
dispatch (method_name) =>
function
- Returns a Lua function that implements the method call. Note that the
object is encapsulated into that function so that the call will be turned
into a real method call.
luaXMLRPC client +
phpXMLRPC server 实例
php服务器端运行环境, 需要先行安装 xamp
软件包(https://www.apachefriends.org/zh_cn/index.html),
xamp为 x系统(包括 Linux windows mac) + a (Apache web server)+ m (MySql database)+
p (php server script interpretor),
为流行的php开发环境。
phpXMLRPC服务器端,
xmlrpc还不是php的原始库,需要下载,下载地址 http://phpxmlrpc.sourceforge.net/。
下载后,解压后,将其的lib目录拷贝出来并命名为libphpxmlrpc, 拷贝到 php 的
xamp/php/pear(珍珠)目录。
使用下面博客中 加法
服务例子(http://blog.csdn.net/flyingfalcon/article/details/2229488),
在\xampp\htdocs目录下建立一个php文件 xmlrpc_server.php:
<?phpinclude ("libphpxmlrpc/xmlrpc.inc");
include ("libphpxmlrpc/xmlrpcs.inc");if ($_SERVER[‘REQUEST_METHOD‘] != ‘POST‘)
exit(0);$add_sig = array(array($xmlrpcString, $xmlrpcInt, $xmlrpcInt));
$add_doc = "Add the two integer together";function add($params)
{
global $xmlrpcerruser;$val = php_xmlrpc_decode($params);
$ret = $val[0] + $val[1];
return new xmlrpcresp(new xmlrpcval($ret, "int"));
}$server = new xmlrpc_server(array(
"add" => array(
"function" => "add",
"signature" => $add_sig,
"docstring" => $add_doc
)));?>
luaXMLRPC 客户端,按照github下载的压缩包中的帮助文档, 将 src文件夹命名为 xmlrpc,
拷贝到 LUA_PATH 目录即可, 即与 lua.exe 平级。
Lua XML-RPC is composed by three Lua files:
init.lua
- Main source file providing the API
http.lua
- API to call XML-RPC via HTTP
server.lua
- Server side API
These files should be copied to a directory
namedxmlrpc
created in
yourLUA_PATH
.
luaXMLRPC客户端代码,放到test.lua中, 与lua.exe平级,功能 实现 加法 XMLRPC 请求,
require "xmlrpc.http"local ok, res = xmlrpc.http.call ("http://127.0.0.1/xmlrpc_server.php", "add", 1, 2)
if not ok then
print ("not ok")
print("error="..res)
else
print ("ok")
print("sum ="..res);
end
客户端运行结果
LuaXMLRPC笔记