模拟接口响应规则实战

模拟一个接口,总的来说就是配置 mapping 文件,mapping 文件中又分为 Request 的配置和 Response 的配置。

Request配置

  • method:配置接口的请求方法

    • 通常接口的请求方式,如GET、POST、PUT、DETELE等
  • urlpath:配置接口的路径参数

    • urlPattern 路径中无查询参数的接口
    • urlPathPattern 路径中有查询参数的接口
  • QueryParameters :配置接口的查询参数只能是固定的名称

  • BodyPatterns:配置请求主体配置设置格式,例如:JSON格式、XML格式等

  • basicAuth:配置基础认证规则

Response配置

  • body:配置接口响应规则返回体
    • body:返回体为字符串
    • jsonBody:返回体为json串
    • bodyFileName:返回体为json文件,该文件存储于__files目录下

模拟响应规则接口定义

需求:对于书籍信息通过接口进行操作,提前需要进行认证

按照RESTful的思想设计一组对书籍信息操作的RESTful API:

请求方式 地址 说明
GET /api/books 获取所有的书籍信息
GET /api/book/id 根据id获取书籍信息,id只有1~4
POST /api/book 创建一个书籍信息
PUT /api/book 修改书籍信息
PATCH /api/book/message 修改书籍的message字段
DELETE /api/book/id 根据id删除书籍信息

请求主体:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"books": [{
"id": 1,
"name": "三国演义",
"price": 100,
"author": "罗贯中",
"message": "四大名著之一"
},
{
"id": 2,
"name": "红楼梦",
"price": 120,
"author": "曹雪芹",
"message": "四大名著之一"
}
]
}

返回响应主体

1
2
3
4
5
6
7
8
{
"code": "00000",
"message": "OK",
"data": [{
"id": 1,
"name": "红楼梦"
}]
}

接口响应规则的配置

  • 获取所有的书籍信息
  • 根据id获取书籍信息
  • 创建一个书籍信息
  • 修改书籍信息
  • 修改书籍的message字段
  • 根据id删除书籍信息

对应生成的响应规则的文件和响应体的文件放入到__filesmappings文件夹中,启动standalone服务后,可用Postman工具请求,查看。

总结

  • 如果模拟的接口无查询参数,那么使用 urlPattern 即可。
  • 如果模拟的接口有查询参数,但对查询参数的名字和个数无任何限制,那么使用urlPathPattern即可。
  • 如果模拟的接口有查询参数,且对查询参数的名称和值都有限制,那么需要在mapping文件中添加queryParameters进行控制。

模拟XML响应规则接口定义

以上是JSON响应规则的接口定义,如果是XML的呢?与json区别的地方是 BodyPatterns的配置,XML格式的接口在mapping文件中配置bodyPatterns时有两种方式:

  • 第一种是使用equalToxml方式

    • 假如我们需要Mock一个Post请求接口,接口的Body体如下,且Body中每个字段以及字段的值都是固定的。

      1
      2
      3
      4
      <person>
      <firstName>Done</firstName>
      <lastName>Jone</lastName>
      </person>

      针对这样的接口我们可以采用equalToxml的方式,mapping文件内容如下,可以看到和Mock JSON格式的接口相比,只是把header中Content-Type定义为application/xml,BodyPattern中使用equalToXml方式定义 Request Body内容。

    • 响应规则如下定义

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      {
      "request": {
      "method": "POST",
      "urlPathPattern": "/api/user/xml/([a-z]*)",
      "headers": {
      "Content-Type": {
      "equalTo": "application/xml"
      }
      },
      "bodyPatterns": [{
      "equalToXml": "<person><firstName>Done</firstName><lastName>Jone</lastName></person>"
      }]
      },
      "response": {
      "status": 200,
      "body": "<code>0</code><message>add person with equalToXml successfully</message>",
      "headers": {
      "Content-Type": "application/xml"
      }
      }
      }
  • 第二种是使用matchesXmlPath方式

    • 例如如下接口,我们只想控制 Request Body中price字段的值包含数字1,Body体内容如下

      1
      2
      3
      4
      <book>
      <bookName>test</bookName>
      <price>12</price>
      </book>
    • 对于这样的接口使用matchesXmlPath配置,响应规则如下定义

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      {
      "request": {
      "method": "POST",
      "urlPathPattern": "/api/user/add",
      "headers": {
      "Content-Type": {
      "equalTo": "application/xml"
      }
      },
      "bodyPatterns": [
      {
      "matchesXPath": {
      "expression": "//price/text()",
      "contains": "1"
      }
      }
      ]
      },
      "response": {
      "status": 200,
      "body": "add user with xpath bodyPatterns successfully"
      }
      }

总结

  • 如果对接口的Body体内容有严格要求(字段名称,字段值都有限制)那么可以采用equalToXml方式定义Request Body 。
  • 如果只对接口Body体局部字段值有控制,那么可以采用matchesXpath的方式进行定义。
  • 如果对Request Body无任何要求,那么不配置bodyPatterns,只需把Header 中content-Type设置为application/xml即可。