11/15/17

Validate Response Header using Rest-Assured

Every response that is received from a server contains zero or more headers. Headers are the part of Response that is sent by the server. Each header entry is basically a Key-Value pair. Headers are used to send across extra information by the server. This extra information is also referred to as Meta data of the Response.

Using the Headers a client can take intelligent decisions for e.g.
One of the Headers called Content-Type which tells how to interpret the data present in the Body of the Response. If the Body contains data in the form of JSON, then the value of Content-Type header will be application/json. Similarly if the data in the body is XML the Content-Type header will be application/xml.

Get different Header Types received in a Response

Let’s just see how to read a Header using Rest-Assured. To do that lets do a simple exercise in which the test would record the following Header Types from the Response:
  • Content-Type
  • Server
  • Content-Encoding
The Response interface provides direct methods to access individual header or all the Headers. Simply do a Response followed by a dot (Response.head),  all the available methods to get headers will be displayed. Below image shows the available methods
AllHeaderMethods

In the below code, .header(String arg0) method is used to get a particular header. In the argument of this method pass the exact header name.
@Test
public void GetWeatherHeaders()
{
    RestAssured.baseURI = "http://restapi.demoqa.com/utilities/weather/city";
    RequestSpecification httpRequest = RestAssured.given();
    Response response = httpRequest.get("/Hyderabad");

    // Reader header of a give name. In this line we will get
    // Header named Content-Type
    String contentType = response.header("Content-Type");
    System.out.println("Content-Type value: " + contentType);

    // Reader header of a give name. In this line we will get
    // Header named Server
    String serverType =  response.header("Server");
    System.out.println("Server value: " + serverType);

    // Reader header of a give name. In this line we will get
    // Header named Content-Encoding
    String acceptLanguage = response.header("Content-Encoding");
    System.out.println("Content-Encoding: " + acceptLanguage);
}
In this code we are trying to get the Content-Type,  Server and Content-Encoding headers. The exact values will be printed out in the Console window using the System.out.println statement. The out of this test looks like this
ReadingIndividualHeader
Note: Response.GetHeader(String headerName) method does exactly the same thing as the Response.Header(String headerName) method does. So the above can be written with replacing .Header with .GetHeader. Try it out yourself.

Print all the Headers received in a Response

All the headers in a Response can also be printed by simply iterating over each Header. Response interface provides two methods
  • headers() : returns Headers
  • getHeaders() : returns Headers
This collection is represented by a class called io.restassured.http.Headers. Headers class implements the Iterable interface. Hence, for each (for( : )) loop can be used to read all the headers, as shown in the code below:
@Test
public void IteratingOverHeaders()
{
    RestAssured.baseURI = "http://restapi.demoqa.com/utilities/weather/city";
    RequestSpecification httpRequest = RestAssured.given();
    Response response = httpRequest.get("/Hyderabad");

    // Get all the headers. Return value is of type Headers.
    // Headers class implements Iterable interface, hence we
    // can apply an advance for loop to go through all Headers
    // as shown in the code below
    Headers allHeaders = response.headers();

    // Iterate over all the Headers
    for(Header header : allHeaders)
    {
        System.out.println("Key: " + header.getName() + " Value: " + header.getValue());
    }
}

Validate Response Header using Rest-Assured

Now that we have have a mechanism to read a Header. Let’s write a test to validate the values of the header by putting an Assert. The code is simple and its mostly same as the above code. The only difference is that instead of having a print statement, TestNg Assert is used. Here is the code.
//@Test
public void GetWeatherHeaders()
{
    RestAssured.baseURI = "http://restapi.demoqa.com/utilities/weather/city";
    RequestSpecification httpRequest = RestAssured.given();
    Response response = httpRequest.get("/Hyderabad");

    // Reader header of a give name. In this line we will get
    // Header named Content-Type
    String contentType = response.header("Content-Type");
    Assert.assertEquals(contentType /* actual value */, "application/json" /* expected value */);

    // Reader header of a give name. In this line we will get
    // Header named Server
    String serverType =  response.header("Server");
    Assert.assertEquals(serverType /* actual value */, "nginx/1.12.1" /* expected value */);

    // Reader header of a give name. In this line we will get
    // Header named Content-Encoding
    String contentEncoding = response.header("Content-Encoding");
    Assert.assertEquals(contentEncoding /* actual value */, "gzip" /* expected value */);
}

0 comments:

Post a Comment

Google Q&A Forum