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

posted @   未来可期_Durant  阅读(373)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示