一、需求背景
在现在的项目架构中,经常会对接口进行加解密的需求,来加强安全性,特别是金融行业更是如此,如银行。那么,假如我们也是采用的restassured来封装apiobject,但是又不想破坏原来的结构,那又如何来实现呢。
二、解决方案
restassurde的filter
1、filter机制
A filter req -> B filter req -> C filter req -> send -> A filter res -> B filter res -> C filter res
三、事前准备
1、使用python搭建本地建议局域网
2、原始的json报文(企业微信部门查询接口的样例)
{
"errcode": 0,
"errmsg": "ok",
"department": [
{
"id": 2,
"name": "广州研发中心",
"name_en": "RDGZ",
"parentid": 1,
"order": 10
},
{
"id": 3,
"name": "邮箱产品部",
"name_en": "mail",
"parentid": 2,
"order": 40
}
]
}
3、经过base64加密之后的报文
ewoJImVycmNvZGUiOiAwLAoJImVycm1zZyI6ICJvayIsCgkiZGVwYXJ0bWVudCI6IFt7CgkJCSJpZCI6IDIsCgkJCSJuYW1lIjogIuW5v+W3nueglOWPkeS4reW/gyIsCgkJCSJuYW1lX2VuIjogIlJER1oiLAoJCQkicGFyZW50aWQiOiAxLAoJCQkib3JkZXIiOiAxMAoJCX0sCgkJewoJCQkiaWQiOiAzLAoJCQkibmFtZSI6ICLpgq7nrrHkuqflk4Hpg6giLAoJCQkibmFtZV9lbiI6ICJtYWlsIiwKCQkJInBhcmVudGlkIjogMiwKCQkJIm9yZGVyIjogNDAKCQl9CgldCn0=
四、示例
1、原始无加密的返回报文测试用例
@Test void raw(){ Response response = given() .log ().all () .contentType ( ContentType.JSON) .get ("http://127.0.0.1:8888/row.json") .then () .log ().all () .extract () .response (); assertEquals("广州研发中心",response.path ( "department.name[0]" ).toString ());
2、经过base64加密之后返回的测试用例
@Test void encode(){ Response response = given() .filter ( (req,res,ctx)->{ //返回的Response不具备set方法,无法修改body Response originResponse = ctx.next ( req,res ); //ResponseBuilder的作用主要是在Response的基础上建设出来一个新的可以修改body的对象 ResponseBuilder responseBuilder = new ResponseBuilder ().clone ( originResponse ); //解密过程 String encodeBody = originResponse.getBody ().asString (); byte[] decodeBody = Base64.getDecoder ( ).decode ( encodeBody ); responseBuilder.setBody ( new String ( decodeBody ) ); //ResponseBuilder在最后通过build方法直接创建一个用于返回的不可修改的Response Response responseNew = responseBuilder.build (); return responseNew; } ) .log ().all () .contentType ( ContentType.JSON) .get ("http://127.0.0.1:8888/encode.json") .then () .log ().all () .extract () .response (); assertEquals("广州研发中心",response.path ( "department.name[0]" ).toString ()); }
测试结果:
五、filter全局设计
待处理
六、总结
restassured的filter作用很大,还需我们去仔细研究。这里的是不破坏原来的请求结构来对加密的报文解密,并且后面是对json格式的报文断言,那么有一个启发,可以使用filter机制,对非json格式(如xml,或者是二进制文件),只要是使用http协议,都可以转换成json格式,最后统一为json格式断言
restassured的filter机制官网:
https://github.com/rest-assured/rest-assured/wiki/Usage#filters