继续来学习Rest Assured中常见的功能,上篇介绍了两种方法得到不同类型的响应数据,其实还有一个方法,可以把响应对象装换成字节数组对象。第二个介绍extract().path()方法去摘取某一个字段的值,最后介绍我们实际接口用例开发中的写法是,先获取响应对象,然后根据响应对象提供的方法,去解析拿到响应正文,状态码和响应头字段等。
1.响应转换成字节数组
虽然我也不知道为什么要转换成字节数组,以及这种字节数组的好处在哪里,这里来看看如何转换。
/**
* 以字节数组方式拿到响应对象
* @throws IOException
*/
@Test
public void testGetResponseAsByteArray() throws IOException {
byte[] bytes = get("https://reqres.in/api/users/2").asByteArray();
System.out.println("The Response: \n\n" + bytes.length);
//遍历这个字节数组看看
for (byte b : bytes) {
System.out.print(b + " ");
}
}
运行结果
170
123 34 100 97 116 97 34 58 123 34 105 100 。。。这后面还有很多没写出来
2.使用path()和extract()方法摘取内容
场景浏览器打开 http://jsonplaceholder.typicode.com/photos/1
第一步通过相关方法摘取上面红圈这个url的内容,然后拿着这个url去进行发送get请求。
/**
* 使用path方法提取内容
*/
@Test
public void testExtractDetailsUsingPath() {
String href =
when().
get("http://jsonplaceholder.typicode.com/photos/1").
then().
contentType(ContentType.JSON).
body("albumId", equalTo(1)).
extract().
path("url");
System.out.println(href);
when().get(href).then().statusCode(200);
}
运行结果
[RemoteTestNG] detected TestNG version 6.14.3
https://via.placeholder.com/600/92c952
PASSED: testExtractDetailsUsingPath
上面then()后两行代码的意思是,contentType是设置响应内容为JSON格式,之前我们都是默认,不进行显式设置。body这行代码是对响应正文进行断言,判断这个id是不是等于1. 后面extract().path()是根据xpath路径去摘取这个字段的值。也就是上面红圈这个url,拿到之后去执行发送请求。
上面这个用例,还可以一行代码简写成这样。
/**
* 使用path方法提取内容,一行代码写法
*/
@Test
public void testExtractDetailsUsingPath2() {
String href = get("http://jsonplaceholder.typicode.com/photos/1").path("url");
System.out.println(href);
when().get(href).then().statusCode(200);
//第二种写法
String href1 = get("http://jsonplaceholder.typicode.com/photos/1").andReturn().jsonPath().getString("url");
System.out.println(href1);
when().get(href1).then().statusCode(200);
}
3.先拿到响应再做其他事情(重点掌握)
有时候我们并不喜欢我们上面这些写法,很多场景下,我们都是习惯先拿到响应对象,然后再去做其他事情。例如获取响应头,获取响应状态码,然后获取响应正文中部分字段的值等,看看下面这个例子。
/**
* 先拿到响应对象,然后再解析
*/
@Test
public void testFirstGetResponseThenDoActions() {
Response resp = get("http://jsonplaceholder.typicode.com/photos/1").
then().
extract().
response();
// 解析响应
System.out.println("Context Type: " + resp.contentType());
System.out.println("Status Code: " + resp.statusCode());
System.out.println("Href: " + resp.path("url"));
}
运行结果:
[RemoteTestNG] detected TestNG version 6.14.3
Context Type: application/json; charset=utf-8
Status Code: 200
Href: https://via.placeholder.com/600/92c952
PASSED: testFirstGetResponseThenDoActions