REST Assured 系列汇总 之 REST Assured 48 - How To Pass Headers In Rest Assured Requests
前提条件
添加 rest assured 依赖包
<!-- REST Assured -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>4.4.0</version>
</dependency>
什么是 Header?
Header 是一个 API 的 request 和 response 的元数据 metadata。例如:我们传到 request 的 payload 需要按某种格式,JSON 或 XML 或其它类型。相似,response 也可能是某种格式。我们可以用 request 和 response 的 headers 用来帮助服务端和客户端更好的理解 request 和 response。
我们也可以通过 headers 来传 authorization 认证信息。当我们发起一个 API 时,很多默认的 headers 会加入到 request 和 response 中,为了建立了个更安全更快的连接。一些常用的 headers 是 “Content-Type”, “Accept”, “Authorization”, “ETag” 等.
Headers 可能是一个键值对,或一个键有多个值。接下来我们了解一下 rest assured 是怎样传递 headers的。
How to add headers to Rest Assured request?
RequestSpecification 和 ResponseSpecification 接口有很多重载方法 “headers()” 和 “header()”,用 RequestSpecification 的 headers() 或 header() 方法发送一个带 headers 的request,ResponseSpecification 的 headers() 或 header() 方法来断言收到的 response 的 headers。这两者还是有些细微的区别的,不要认为我们可以通过 ResponseSpecification 的 headers() 或 header() 方法 给一个 response 加 headers。
重载的 headers() 和 header()方法
1. RequestSpecification headers(String firstHeaderName, Object firstHeaderValue, Object... headerNameValuePairs);
2. RequestSpecification headers(Map<String, ?> headers);
3. RequestSpecification headers(Headers headers);
4. RequestSpecification header(String headerName, Object headerValue, Object... additionalHeaderValues);
5. RequestSpecification header(Header header);
多种方式添加 一个 header
假设一个 header 名字为 “someHeader”,且其值为 “somevalue“,我们可以有如下多种方式传递这个 header 在 request。
// Add a header as key value
RestAssured.given().header("someHeader","somevalue");
RestAssured.given().headers("someHeader","somevalue");
// Add header as a Map
Map<String,String> requestHeaders = new HashMap<>();
requestHeaders.put("someHeader","somevalue");
RestAssured.given().headers(requestHeaders);
// Add header using Header class
Header requestHeader1 = new Header("someHeader","somevalue");
RestAssured.given().header(requestHeader1);
// Add header using Header and Headers class
Header requestHeader2 = new Header("someHeader","somevalue");
Headers requestHeaders3 = new Headers(requestHeader2);
RestAssured.given().headers(requestHeaders3);
观察上面重载的 headers() 和 header() 方法,它们可以接收不同的形式的参数。 header() 用来加单个的 header,而 headers() 用来加多个 header。
Header是一个类,它代表一个 header,Headers 类代码多个 header 的集合。需要实例化 Header 或 Headers 来创建 header 信息。
添加重复的 header
可以传递重复的 headers,其值不会被覆盖。例如,你给一个 header1 传递两个值 value1 和 value 2,将合并成 header1=value1 和 header1=value2 这种形式传递。这是默认行为,即使 header 的值也是重复的,也将按这种方式发送。
可以多次调用一个相同的方式,或混合方法。所有的 headers 将会加到 request 中,不管是唯一的,还是重复的headers。如果一个 header 有多个值,可以用一个专用的方法添加,如下:
RequestSpecification header(String headerName, Object headerValue, Object… additionalHeaderValues);
例如:
RestAssured.given().header("someHeader","someFirstvalue", "someSecondvalue");
注意一个 Map 是不能有重复的 key 的,所以如果你需要传递一个有多个值的 header 就不能用 Map了。
怎样改变默认的 header 合并行为?
如果多次添加同一个 header 的不同值,默认 header的值不会被覆盖(除了 “Content-Type” 和 “Accept”)。但是可以用 HeaderConfig 类来实现重写这种行为。
// Define headers that should be be merged instead of overwritten
mergeHeadersWithName(headerName, additionalHeaderNames)
// Define headers that should be overwritten instead of merged
overwriteHeadersWithName(headerName, additionalHeaderNames)
例如:
RestAssuredConfig.config().headerConfig(HeaderConfig.headerConfig().overwriteHeadersWithName(“header1”));
如果传递 header1 的两个值 value1 和 value2,那么它不会合并,最终是只取最后一个值。例如:header1 只有一个值以 header1 = value2 传递。
RestAssuredConfig.config().headerConfig(HeaderConfig.headerConfig().mergeHeadersWithName(“header1”));
如果想传递一个 header1 有两个值 value1 和 value2,它将合并成 header1=value1 和 header1=value2 传递, 这是默认的行为。
代码:
import java.util.HashMap;
import java.util.Map;
import io.restassured.RestAssured;
import io.restassured.config.HeaderConfig;
import io.restassured.config.RestAssuredConfig;
import io.restassured.http.Header;
import io.restassured.http.Headers;
import org.junit.Test;
public class AddingHeaders {
@Test
public void addKeyvaluePairHeaders() {
// Add a header as key value
System.out.println("Add a header as key value");
RestAssured.given()
.header("someHeader","somevalue")
.headers("someHeader","somevalue")
.log().headers()
.get("https://restful-booker.herokuapp.com/booking/10");
// Add header as a Map
System.out.println("Add header as a Map");
Map<String,String> requestHeaders = new HashMap();
requestHeaders.put("someHeader","somevalue");
RestAssured.given()
.headers(requestHeaders)
.log().headers()
.get("https://restful-booker.herokuapp.com/booking/10");
// Add header using Header class
System.out.println("Add header using Header class");
Header requestHeader1 = new Header("someHeader","somevalue");
RestAssured.given()
.header(requestHeader1)
.log().headers()
.get("https://restful-booker.herokuapp.com/booking/10");
// Add header using Header and Headers class
System.out.println("Add header using Header and Headers class");
Header requestHeader2 = new Header("someHeader","somevalue");
Headers requestHeaders3 = new Headers(requestHeader2);
RestAssured.given()
.headers(requestHeaders3)
.log().headers()
.get("https://restful-booker.herokuapp.com/booking/10");
// Add header with multiple values
System.out.println("Add header with multiple values");
RestAssured.given()
.header("someHeader","someFirstvalue", "someSecondvalue")
.log().headers()
.get("https://restful-booker.herokuapp.com/booking/10");
// Changing default behavior of merging
System.out.println("Changing default behavior of merging");
RestAssured.given()
.config(RestAssuredConfig.config().headerConfig(HeaderConfig.headerConfig().mergeHeadersWithName("header1")))
.header("header1","someFirstvalue")
.header("header1","someSecondvalue")
.log().headers()
.get("https://restful-booker.herokuapp.com/booking/10");
// Change overwrite behavior if not
System.out.println("Change overwrite behavior if not");
RestAssured.given()
.config(RestAssuredConfig.config().headerConfig(HeaderConfig.headerConfig().overwriteHeadersWithName("header1")))
.header("header1","someFirstvalue")
.header("header1","someSecondvalue")
.log().headers()
.get("https://restful-booker.herokuapp.com/booking/10");
}
}
输出:
Add a header as key value
Headers: someHeader=somevalue
someHeader=somevalue
Accept=*/*
Add header as a Map
Headers: someHeader=somevalue
Accept=*/*
Add header using Header class
Headers: someHeader=somevalue
Accept=*/*
Add header using Header and Headers class
Headers: someHeader=somevalue
Accept=*/*
Add header with multiple values
Headers: someHeader=someFirstvalue
someHeader=someSecondvalue
Accept=*/*
Changing default behavior of merging
Headers: header1=someFirstvalue
header1=someSecondvalue
Accept=*/*
Change overwrite behavior if not
Headers: header1=someSecondvalue
Accept=*/*