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("{\n" + " \"touser\" : \"@all\",\n" + " \"msgtype\" : \"text\",\n" + " \"agentid\" : 1000002,\n" + " \"text\" : {\n" + " \"content\" : \"你的快递已到,请携带工卡前往邮件中心领取。\\n出发前可查看<a href=\\\"http://work.weixin.qq.com\\\">邮件中心视频实况</a>,聪明避开排队。\"\n" + " }") .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","你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\\\"http://work.weixin.qq.com\\\">邮件中心视频实况</a>,聪明避开排队。\"\n" ); //组装消息的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": "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\\\"http://work.weixin.qq.com\\\">邮件中心视频实况</a>,聪明避开排队。\"\n" } }
所以定义两个对象实体类,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 ( "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\\\"http://work.weixin.qq.com\\\">邮件中心视频实况</a>,聪明避开排队。\"\n" ); 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