我很高兴地宣布,Moco 1.2.0正式发布了。
Moco是什么?
Moco 是一个可以轻松搭建模拟服务器的框架/工具/程序库。
主要能力
Moco 可以方便地支持 HTTP 模拟服务器的搭建。
-
根据需要,匹配响应的请求,返回相应的应答,配置诸如 HTTP 版本、内容和 HTTP 头等信息。
-
模拟服务器的特殊场景,比如,响应慢。
-
将转发请求至远程服务器,隔离不稳定的服务器。
-
接收请求后异步调用,模拟多级 HTTP 请求的场景。
-
用于单元测试场景,校验请求状况,进行细节验证。
-
提供文件挂载能力,给前端开发提供便利。
更详细的 API,请参考 API。
更多的使用方式,请参考 用法。
版本变更
1.2.0 版本的主要变更是
- 增加了对 Websocket 的支持
此外,还有一些小的变更
-
在 Java API 中增加了
transform
,支持内容转换,以便实现应答加密等效果 -
在 Java API 中增加了
binary
,支持以字节数组的方式编写二进制应答
Websocket
一些服务会同时提供 REST API 和 Websocket API,比如,通过 REST API 进行全量数据查询,用 Websocket API 推送增量数据。
在 Moco 里,一个 websocket 服务器要从一个 HTTP 服务器中创建出来,其基本配置如下所示:
HttpServer server = httpServer(12306);
WebsocketServer webSocketServer = server.websocket("/ws");
websocketServer.connected("connected");
websocketServer.ping("ping").pong("pong");
webSocketServer.request(by("foo")).response("bar");
复制代码
Websocket 的 JSON API 配置可以与 HTTP 服务器写在一个配置文件里,其基本结构如下所示:
[
{
"websocket": {
"uri": "/ws",
"connected": "connected",
"pingpongs": [
{
"ping": "ping",
"pong": "pong"
}
],
"sessions": [
{
"request": {
"text": "foo"
},
"response": {
"text": "bar"
}
}
]
}
}
]
复制代码
请求/应答
设置请求与应答的方式与 Moco 常规的用法类似,下面是 Java API 的用法:
webSocketServer.request(by("foo")).response("bar");
复制代码
JSON API 的用法如下:
{
"websocket": {
"uri": "/ws",
"sessions": [
{
"request": {
"text": "foo"
},
"response": {
"text": "bar"
}
}
]
}
}
复制代码
连接消息
Websocket 服务器可以在客户端连接到服务器上时,给客户端推送一个消息,这可以通过 connected
实现,下面是 Java API 的用法:
webSocketServer.connected("connected");
复制代码
JSON API 的用法如下:
{
"websocket": {
"uri": "/ws",
"connected": "connected"
}
}
复制代码
Ping/Pong
Websocket 服务器通常会发送 Ping/Pong 消息以维持心跳,设置 Ping/Pong 消息的做法如下所示:
websocketServer.ping("ping").pong("pong");
复制代码
JSON API 用法如下所示:
{
"websocket": {
"uri": "/ws",
"pingpongs": [
{
"ping": "ping",
"pong": "pong"
}
]
}
}
复制代码
广播
Websocket 一个常见的用法是客户端订阅相应的频道,当有数据变动时,服务器端进行推送。在 Moco 里,我们可以使用广播机制(broadcast
)做到这一点。下面这段代码可以通过向 Websocket 服务器推送一条消息,然后,给所有连到该服务器的客户端广播一条消息:
webSocketServer.request(by("foo")).response(broadcast("bar"));
复制代码
JSON API 用法如下所示:
{
"request": "foo",
"response": {
"broadcast": {
"content": "bar"
}
}
}
复制代码
如果希望实现订阅频道的效果,也就是只为特定的客户端推送消息,该客户端需要先加入到一个特定的组中,实现订阅,然后,推送消息时指定为该组推送消息即可:
webSocketServer.request(by("subscribeFoo")).response(with("fooSubscribed"), join(group("foo")));
webSocketServer.request(by("foo")).response(broadcast(text("bar"), group("foo")));
复制代码
在这段代码中,通过发送 subscribeFoo
,客户端就加入了 foo
这个组中。当服务器端收到 foo
消息时,就可以对 foo
这个组进行广播,其消息内容为 bar
。
JSON API 用法如下;
[
{
"request": "subscribeFoo",
"response": {
"text": "fooSubscribed",
"group": "foo"
}
},
{
"request": "foo",
"response": {
"broadcast": {
"group" : "foo",
"content": "bar"
}
}
}
]
复制代码
关于 Websocket 更多的细节,请参考 Websocket API。
其它变更
transform
在某些场景下,设置的内容需要经过一些转换才能发送给客户端,比如,对内容进行加密处理。在这种情况下,可以使用 transform
在代码中对应答进行转换。
server.response(text("hello").transform(raw -> {
byte[] transformed = newbyte[raw.length];
for (int i = 0; i < raw.length; i++) {
transformed[i] = (byte) (raw[i] + 1);
}
return transformed;
});
复制代码
binary
为了支持二进制方式的应答,Moco 增加了 binary
API,目前只包括 Java API 形式:
server.response(binary(newbyte[] {1, 2, 3}));
复制代码
欢迎使用 1.2.0 版本,体验 Moco 最新的功能!