REST Assured 48 - How To Pass Headers In Rest Assured Requests

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?

RequestSpecificationResponseSpecification 接口有很多重载方法 “headers()” 和 “header()”,用 RequestSpecificationheaders()header() 方法发送一个带 headers 的request,ResponseSpecificationheaders()header() 方法来断言收到的 response 的 headers。这两者还是有些细微的区别的,不要认为我们可以通过 ResponseSpecificationheaders()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=*/*

Guess you like

Origin blog.csdn.net/wumingxiaoyao/article/details/120381735