REST Assured 系列汇总 之 REST Assured 49 - How To Retrieve Single And MultiValue Headers From Response Using Rest Assure
介绍
当发起一个 API 请求时,Server 端会返回 response body 和一些 header。我们有时需要断言 response 中的这些 header,所以首先我们需要从 response 中获取这些 header。
注意区分 request 的 header 和 response 的 header。我们可以控制 request 的 header (除了自动生成的 headers),对于 response 的 header,我们只能可读。
本文概要:
- 从 response 中获取单个 header 的值
- 从 response 中获取多个 headers
- getHeaders(), getHeader(String headerName), headers(), header(String headerName) 方法的用法
- 怎样断言 header
前提条件
添加 rest assured 依赖
<!-- REST Assured -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>4.4.0</version>
</dependency>
从 response 中获取 headers
一旦发起一个 API 请求,我们就需要提取 response。REST Assured 有一个 Response 接口,代表一个 request 的 response。
Response response=
RestAssured
.given()
.get("https://restful-booker.herokuapp.com/booking/1");
或
Response response=
RestAssured
.given()
.get("https://restful-booker.herokuapp.com/booking/1")
.then()
.extract()
.response();
Response 接口有 4 个方法(有效2个)来获取 header。
header(String headerName) 或 getHeader(String headername) – 获取单个 header 的值
headers() or getHeaders() – 获取所有 headers
REST Assured 中有些方法只是为了语法 syntactic sugar,例如上面方法,getHeader() 看上去比 header() 可读性更好。
一个 header 是一个键值对或一个键多个值。如果想要获取一个具体的 header,可以用 getHeader(String headerName) 或 header(String headerName) 通过 header 名字来获取其值,返回类型是字符串。想要获取所有 headers,可用 headers() 或 getHeaders() ,返回类型是 Headers object。
import org.junit.Test;
import io.restassured.RestAssured;
import io.restassured.http.Header;
import io.restassured.http.Headers;
import io.restassured.response.Response;
public class RetrievingResponseHeaders {
@Test
public void getALlHeadersFromResponse()
{
Response response=
RestAssured
.given()
.get("https://restful-booker.herokuapp.com/booking/1")
.then()
.extract()
.response();
System.out.println("All Headers of response are :- ");
Headers allHeaders = response.getHeaders();
for(Header header : allHeaders)
{
System.out.print(header.getName() +" : ");
System.out.println(header.getValue());
}
System.out.println("Value of Header Content-Type : "+response.getHeader("Content-Type"));
}
}
一个 header 是一个多个值的 header,我们可以通过下面方式获取所有值:
// Suppose Content-Type is a multivalue header
List<Header> allValue = response.getHeaders().getList("Content-Type");
for(Header header : allValue)
{
System.out.print(header.getName() +" : ");
System.out.println(header.getValue());
}
List<String> allValue1 = response.getHeaders().getValues("Content-Type");
for(String value : allValue1)
{
System.out.println(value);
}
怎样断言 header
如果想从 response 中获取一个不存在的 header,将返回 NULL。可以用一个用户自定义 user-defined 的方法可以用来判断一个 header 是否出现在 response。
REST Assured 有一个现存的方法 hasHeaderWithName(String headerName), 如果该 header 存在则返回 true,否则返回 false。
boolean isPresent = response.getHeaders().hasHeaderWithName("Content-Type");
如果用 getHeaders() 也可以通过 get() 或 getValue() 获取header 的值。
String v1 = response.getHeaders().get("Content-Type").getValue();
String v2 = response.getHeaders().getValue("Content-Type");