Moco 1.2.0 发布了

图片

我很高兴地宣布,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 最新的功能!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享