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






















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
