- Sekiro:https://github.com/virjar/sekiro
- 文档: http://sekiro.iinti.cn/sekiro-doc/
- 安装包下载:https://oss.iinti.cn/sekiro/sekiro-demo
运行
- 安装 java(自行安装)
- 运行启动脚本:
- bin/SekiroMain.sh :mac or linux
- bin/SekiroMain.bat :windows
配置
conf/config.properties配置定制参数,目前只支持配置服务端口server.port=5612conf/logback.xml可以用来配置日志输出规则注入
通过SekiroClient 和 Sekiro 服务器通信,即可直接 RPC 调用浏览器内部方法,官方提供的 SekiroClient 代码样例如下:
function SekiroClient(e) {
if (this.wsURL = e,
this.handlers = {},
this.socket = {},
!e)
throw new Error("wsURL can not be empty!!");
this.webSocketFactory = this.resolveWebSocketFactory(),
this.connect()
}
SekiroClient.prototype.resolveWebSocketFactory = function() {
if ("object" == typeof window) {
var e = window.WebSocket ? window.WebSocket : window.MozWebSocket;
return function(o) {
function t(o) {
this.mSocket = new e(o)
}
return t.prototype.close = function() {
this.mSocket.close()
}
,
t.prototype.onmessage = function(e) {
this.mSocket.onmessage = e
}
,
t.prototype.onopen = function(e) {
this.mSocket.onopen = e
}
,
t.prototype.onclose = function(e) {
this.mSocket.onclose = e
}
,
t.prototype.send = function(e) {
this.mSocket.send(e)
}
,
new t(o)
}
}
if ("object" == typeof weex)
try {
console.log("test webSocket for weex");
var o = weex.requireModule("webSocket");
return console.log("find webSocket for weex:" + o),
function(e) {
try {
o.close()
} catch (e) {}
return o.WebSocket(e, ""),
o
}
} catch (e) {
console.log(e)
}
if ("object" == typeof WebSocket)
return function(o) {
return new e(o)
}
;
throw new Error("the js environment do not support websocket")
}
,
SekiroClient.prototype.connect = function() {
console.log("sekiro: begin of connect to wsURL: " + this.wsURL);
var e = this;
try {
this.socket = this.webSocketFactory(this.wsURL)
} catch (o) {
return console.log("sekiro: create connection failed,reconnect after 2s:" + o),
void setTimeout(function() {
e.connect()
}, 2e3)
}
this.socket.onmessage(function(o) {
e.handleSekiroRequest(o.data)
}),
this.socket.onopen(function(e) {
console.log("sekiro: open a sekiro client connection")
}),
this.socket.onclose(function(o) {
console.log("sekiro: disconnected ,reconnection after 2s"),
setTimeout(function() {
e.connect()
}, 2e3)
})
}
,
SekiroClient.prototype.handleSekiroRequest = function(e) {
console.log("receive sekiro request: " + e);
var o = JSON.parse(e)
, t = o.__sekiro_seq__;
if (o.action) {
var n = o.action;
if (this.handlers[n]) {
var s = this.handlers[n]
, i = this;
try {
s(o, function(e) {
try {
i.sendSuccess(t, e)
} catch (e) {
i.sendFailed(t, "e:" + e)
}
}, function(e) {
i.sendFailed(t, e)
})
} catch (e) {
console.log("error: " + e),
i.sendFailed(t, ":" + e)
}
} else
this.sendFailed(t, "no action handler: " + n + " defined")
} else
this.sendFailed(t, "need request param {action}")
}
,
SekiroClient.prototype.sendSuccess = function(e, o) {
var t;
if ("string" == typeof o)
try {
t = JSON.parse(o)
} catch (e) {
(t = {}).data = o
}
else
"object" == typeof o ? t = o : (t = {}).data = o;
(Array.isArray(t) || "string" == typeof t) && (t = {
data: t,
code: 0
}),
t.code ? t.code = 0 : (t.status,
t.status = 0),
t.__sekiro_seq__ = e;
var n = JSON.stringify(t);
console.log("response :" + n),
this.socket.send(n)
}
,
SekiroClient.prototype.sendFailed = function(e, o) {
"string" != typeof o && (o = JSON.stringify(o));
var t = {};
t.message = o,
t.status = -1,
t.__sekiro_seq__ = e;
var n = JSON.stringify(t);
console.log("sekiro: response :" + n),
this.socket.send(n)
}
,
SekiroClient.prototype.registerAction = function(e, o) {
if ("string" != typeof e)
throw new Error("an action must be string");
if ("function" != typeof o)
throw new Error("a handler must be function");
return console.log("sekiro: register action: " + e),
this.handlers[e] = o,
this
}
;
var client = new SekiroClient("ws://127.0.0.1:5612/business/register?group=test_web&clientId=" + Math.random());
client.registerAction("testAction", function(request, resolve, reject) {
resolve("ok");
});
wss 链接里,如果是免费版,要将 business 改成 business-demo,解释一下涉及到的名词:
- group:业务类型(接口组),每个业务一个 group,group 下面可以注册多个终端(SekiroClient),同时 group 可以挂载多个 Action;
- clientId:指代设备,多个设备使用多个机器提供 API 服务,提供群控能力和负载均衡能力;
- SekiroClient:服务提供者客户端,主要场景为手机/浏览器等。最终的 Sekiro 调用会转发到 SekiroClient。每个 client 需要有一个惟一的 clientId;
- registerAction:接口,同一个 group 下面可以有多个接口,分别做不同的功能;
- resolve:将内容传回给客户端的方法;
- request:客户端传过来的请求,如果请求里有多个参数,可以以键值对的方式从里面提取参数然后再做处理。
本地调用的python代码
import requests
params = {
"group": "test_web",
"action": "testAction",
}
url = "http://127.0.0.1:5612/business/invoke"
response = requests.get(url, params=params)
print(response.text)
628

被折叠的 条评论
为什么被折叠?



