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

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