• rest-assured|参数&Content-Type设置&发送body实战


    一、参数

    我们发送请求经常需要带有参数,使用 given() 就可以实现,当时当我们使用 given() 的时候发现其中有很多传参方法如下:

    • param:通常我们都会使用 given().param 方法来传参,REST Assured 会根据 HTTP 方法自动尝试确定哪种参数类型(即查询或表单参数),如果是 GET,则查询参数将自动使用,如果使用 POST,则将使用表单参数:

      下面我们以企业微信登录接口为例,演示param参数

        @Test
        public void Login(){
            given().
                    log().all()
                    //大家自行去注册企业微信账号,并且正确获取corpid和corpsecret
                    .param ( "corpid","wwc376242756245a87" )
                    .param ( "corpsecret","LTnDiVdqHzzmUz8fj21-0kgxv6wEDs3krBnO-0g4MPw" )
                    .when ()
                    .get("https://qyapi.weixin.qq.com/cgi-bin/gettoken")
                    .then()
                    .statusCode(200)
                    .log().all();
        }

    output:

    Request method:    GET
    Request URI:    https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wwc376242756245a88&corpsecret=LTnDiVdqHzzmUz8fj21-0kgxv6wEDs3krBnO-0g4MPw
    Proxy:            <none>
    Request params:    corpid=wwc376242756245a87
                    corpsecret=LTnDiVdqHzzmUz8fj21-0kgxv6wEDs3krBnO-0g4MPw
    Query params:    <none>
    Form params:    <none>
    Path params:    <none>
    Headers:        Accept=*/*
    Cookies:        <none>
    Multiparts:        <none>
    Body:            <none>
    HTTP/1.1 200 OK
    Server: nginx
    Date: Tue, 29 Jun 2021 09:07:52 GMT
    Content-Type: application/json; charset=UTF-8
    Content-Length: 277
    Connection: keep-alive
    Error-Code: 0
    Error-Msg: ok
    
    {
        "errcode": 0,
        "errmsg": "ok",
        "access_token": "v17VikmModARcZJO-UNBMqLngdPTvTvVE4qYH480cWkbVUXlst8UWKHd3KXv7q7A3V_32I-RlJ4uCv4-DL9D9Xh5_DcIR5wQ9Fjt2E1Ge4EbZloLZnAcisv13VmcTgdN_96YoEAqn5OghRzwIcbp4QOguPT758uLYIcL-h5LvYP8gnesyD2iV9cUhwWg8VvMADUOd_PmcXnjlQrn7BfmZQ",
        "expires_in": 7200
    }
    •  queryParam 和 formParam: 有时候在 PUT 或 POST 请求中,需要区分查询参数和表单参数时,就需要使用queryParam 和 formParam 方法了,具体写法如下:
    given().
           formParam("formParamName", "value1").
           queryParam("queryParamName", "value2").
    when().
           post("/something");
    • pathParam:路径参数相对来说使用的比较少,至少目前来说笔者还未遇到过,下面是它的示例方法:
    post("/reserve/{hotelId}/{roomNumber}", "My Hotel", 23);

      则rest-assured可以这样发送:

    given().
            pathParam("hotelId", "My Hotel").
            pathParam("roomNumber", 23).
    when(). 
            post("/reserve/{hotelId}/{roomNumber}").
    then().
             ..

    二、Content-Type设置

      在我们请求接口的时候,经常需要指定接口的请求格式是什么类型的。很多场景下,不指定类型,是发送不成功或者返回的数据会是乱码。那么则如下:

      

       从上面可以看出,其有两个方法,一个是接收一个字符串,一个是接收一个枚举类,所以一般有两种写法:

    given().contentType(ContentType.JSON). ..
    given().contentType("application/json"). ..

    三、发送body

      

       从上面可以看出body 接收类型有7种,这里我们只演示比较常见的一些

    • 普通型(字符串),以发送企业微信应用消息为例:
    package restassureddemo.weixin;
    
    import io.restassured.http.ContentType;
    import org.junit.jupiter.api.BeforeAll;
    import org.junit.jupiter.api.Test;
    
    import static io.restassured.RestAssured.given;
    
    public class TestWeixin {
    
        public static String access_token;
    
        @BeforeAll
        public static void getAccesstoken(){
            access_token = given()
                    .log().all()
                    .params("corpid","wwc376242756245a87","corpsecret","LTnDiVdqHzzmUz8fj21-0kgxv6wEDs3krBnO-0g4MPw")
                    .get("https://qyapi.weixin.qq.com/cgi-bin/gettoken")
                    .then()
                    .statusCode(200)
                    .log().all()
                    .extract().response().path("access_token");
    
        }
    
        @Test
        void send() {
            given()
                    .log().all()
                    .queryParam("access_token", access_token)
                    .contentType(ContentType.JSON)
    //                .contentType("application/json;charset=utf-8")
                    .body("{
    " +
                            "   "touser" : "@all",
    " +
                            "   "msgtype" : "text",
    " +
                            "   "agentid" : 1000002,
    " +
                            "   "text" : {
    " +
                            "       "content" : "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"
    " +
                            "   }")
                    .post("https://qyapi.weixin.qq.com/cgi-bin/message/send")
                    .then()
                    .log().all();
        }
    }

    output:

    {
        "errcode": 0,
        "errmsg": "ok. Warning: wrong json format. ",
        "invaliduser": ""
    }

    备注:errmsg提示是错误的json format,说明多少是有一些问题的

    表现:

    • 通过 contentType 指定为 JSON,将 HashMap 序列化为 JSON(重点掌握,很多接口的传输内容都是json)
    package restassureddemo.weixin;
    
    import io.restassured.http.ContentType;
    import org.junit.jupiter.api.BeforeAll;
    import org.junit.jupiter.api.Test;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import static io.restassured.RestAssured.given;
    
    public class TestWeixin {
    
        public static String access_token;
    
        @BeforeAll
        public static void getAccesstoken(){
            access_token = given()
                    .log().all()
                    .params("corpid","wwc376242756245a88","corpsecret","LTnDiVdqHzzmUz8fj21-0kgxv6wEDs3krBnO-0g4MPw")
                    .get("https://qyapi.weixin.qq.com/cgi-bin/gettoken")
                    .then()
                    .statusCode(200)
                    .log().all()
                    .extract().response().path("access_token");
    
        }
    
        @Test
        void send_HashMap() {
    
            //组装content的map
            Map<String,Object> contentMap = new HashMap<> ();
            contentMap.put ( "content","你的快递已到,请携带工卡前往邮件中心领取。
    出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"
    " );
    
            //组装消息的map
            Map<String,Object> jsonAsMap = new HashMap<> ();
            jsonAsMap.put ( "touser","@all" );
            jsonAsMap.put ( "msgtype","text" );
            jsonAsMap.put ( "agentid",1000002 );
            jsonAsMap.put ( "text", contentMap);
    
            given()
                    .log().all()
                    .queryParam("access_token", access_token)
                    .contentType(ContentType.JSON)
                    .body ( jsonAsMap )
                    .post("https://qyapi.weixin.qq.com/cgi-bin/message/send")
                    .then()
                    .log().all();
        }
    }

    output:

    {
        "errcode": 0,
        "errmsg": "ok",
        "invaliduser": ""
    }

    备注:

    errmsg无提示,说明OK

    •  通过 contentType 指定为 JSON,将 Message 对象序列化为 JSON

    前提:idea配置好Lombok和jackson相关的库

    给企业微信发送消息的body体结构为:

    Body:
    {
        "touser": "@all",
        "msgtype": "text",
        "agentid": 1000002,
        "text": {
            "content": "你的快递已到,请携带工卡前往邮件中心领取。
    出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"
    "
        }
    }

     所以定义两个对象实体类,Meassage和Text

    import lombok.Data;
    
    @Data
    public class Measage {
    
        private String touser;
        private String msgtype;
        private int agentid;
        private Text text;
        
    }
    import lombok.Data;
    
    @Data
    public class Text {
    
        private String content;
    }

    测试方法:

        @Test
        void send_Message_Object() {
    
            Text text  = new Text ();
            text.setContent ( "你的快递已到,请携带工卡前往邮件中心领取。
    出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"
    " );
            Measage measage = new Measage ();
            measage.setTouser ( "@all" );
            measage.setMsgtype ( "text" );
            measage.setAgentid ( 1000002 );
            measage.setText ( text );
            
            given()
                    .log().all()
                    .queryParam("access_token", access_token)
                    .contentType(ContentType.JSON)
                    .body ( measage )
                    .post("https://qyapi.weixin.qq.com/cgi-bin/message/send")
                    .then()
                    .log().all();
        }

    在此示例中,REST Assured 会将对象序列化为 JSON,因为请求内容类型设置为“application/json”。 如果在类路径中找到,它将首先尝试使用 Jackson,否则将使用 Gson。 如果您将内容类型更改为“application/xml”,则 REST Assured 将使用 JAXB 序列化为 XML。 如果未定义内容类型,REST Assured 将尝试按以下顺序序列化:

    1、JSON using Jackson 2 (Faster Jackson (databind))
    2、JSON using Jackson (databind)
    3、JSON using Gson
    4、JSON using Johnzon
    5、JSON-B using Eclipse Yasson
    6、XML using JAXB

    rest-assured官方使用文档:https://github.com/rest-assured/rest-assured/wiki/Usage#examples

    知道、想到、做到、得到
  • 相关阅读:
    流畅的python——2 数据结构
    流畅的python——1 数据模型
    cpp3 std::bind
    cpp2 std::forward
    什么是 jQuery EasyUI?
    .Core中什么事依赖注入?
    .net 中datetime? 和 datetime 有什么区别?
    C#生成项目失败 错误列表 CS2001 未能找到源文件 “D:XXXXXX.cs”。
    Docker笔记
    ICollection与IEnumerable
  • 原文地址:https://www.cnblogs.com/Durant0420/p/14949655.html
Copyright © 2020-2023  润新知