restassured|接口加解密实战

一、需求背景

在现在的项目架构中,经常会对接口进行加解密的需求,来加强安全性,特别是金融行业更是如此,如银行。那么,假如我们也是采用的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

知道、想到、做到、得到
原文地址:https://www.cnblogs.com/Durant0420/p/15008927.html