Pages

Thursday, July 9, 2020

Custom HTTP Header with the HttpClient

1. Introduction


In this tutorial, You'll learn today how to set custom HTTP Header to HTTPClient Request. If you want to learn and dig deeper, move to the tutorial section Apache HTTPClient here.

All examples in this post, We will use the domain "http://www.google.com" for creating requests. Because it is considered as always up and running.

Sometimes in the interview, the same is asked as "How to send POST parameters with RequestBuilder?"

Custom HTTP Header with the HttpClient



2. Set Custom HTTP Header on Request – 4.3 and Above


HttpClient 4.3 has introduced a new way of building requests with RequestBuilder. RequestBuilder.get() method returns the request. To set the header on the HttpRequest, we'll use the setHeader() method on the builder.


The below example is to set the header as below.

package com.java.w3schools.blog.HttpClient;

import java.io.IOException;

import org.apache.http.HttpHeaders;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.HttpClients;

public class HttpHeaderSetHeaderExample {

 private static String URI = "http://www.google.com";

 public static void main(String[] args) throws ClientProtocolException, IOException {
  HttpClient client = HttpClients.custom().build();
  HttpUriRequest request = RequestBuilder.get().setUri(URI)
    .setHeader(HttpHeaders.CONTENT_TYPE, "application/json").build();
  client.execute(request);

  System.out.println("Getting the header info from request");
  System.out.println("request header propery name : " + request.getAllHeaders()[0].getName());
  System.out.println("request header propery value : " + request.getAllHeaders()[0].getValue());

 }

}

Output:

Getting the header info from request
request header propery name : Content-Type
request header propery value : application/json

3. Set Custom HTTP Header on Request – Before 4.3


It is quite different from version 4.3.  In the older version, you need to use the HttpGet class to create the request. The object of HttpGet is considered a request object. On HttpGet, We'll call setHeader() method. Finally, Invoke the execute() method on HttpClient.

In the below example, we have set the many properties as part of the header.

package com.java.w3schools.blog.HttpClient;

import java.io.IOException;

import org.apache.http.Header;
import org.apache.http.HttpHeaders;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class HttpHeaderSetHeaderExample4_3Before {

 private static String URI = "http://www.google.com";

 public static void main(String[] args) throws ClientProtocolException, IOException {
  HttpClient client = new DefaultHttpClient();
  HttpGet request = new HttpGet(URI);
  request.setHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate, br");
  request.setHeader(HttpHeaders.ACCEPT_LANGUAGE, "en-US,en;q=0.5");
  request.setHeader(HttpHeaders.ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
  request.setHeader(HttpHeaders.CONNECTION, "keep-alive");
  request.setHeader(HttpHeaders.CACHE_CONTROL, "max-age=0");
  request.setHeader(HttpHeaders.USER_AGENT,
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0");
  request.setHeader(HttpHeaders.HOST, "http://www.google.com");

  client.execute(request);

  System.out.println("Getting the header info from request before HttpClient 4.3 version.");

  Header[] headers = request.getAllHeaders();

  for (Header header : headers) {
   System.out.println("request header propery : " + header.getName() + " Value : " + header.getValue());

  }

 }

}

Output:

Getting the header info from request before HttpClient 4.3 version.
request header propery : Accept-Encoding Value : gzip, deflate, br
request header propery : Accept-Language Value : en-US,en;q=0.5
request header propery : Accept Value : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
request header propery : Connection Value : keep-alive
request header propery : Cache-Control Value : max-age=0
request header propery : User-Agent Value : Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
request header propery : Host Value : http://www.google.com

4. Set Default Header on the Client


There is an option to set common headers to all requests at once. In this approach, setting up headers info is done only once.

Instead of setting the Headers info on each and every request, we can also configure it as a default header on the Client itself.

When Creating HTTPClient, call setDefaultHeaders() method which takes List of Headers and set them to each request.

This is extremely helpful when the header needs to be the same for all requests – such as a custom application header.

package com.java.w3schools.blog.HttpClient;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import org.apache.http.Header;
import org.apache.http.HttpHeaders;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.HttpParams;

public class HttpHeaderSetHeaderExample4_3Before {

 private static String URI = "http://www.google.com";

 public static void main(String[] args) throws ClientProtocolException, IOException {

  Header header1 = new BasicHeader(HttpHeaders.CONTENT_TYPE, "application/json");
  Header header2 = new BasicHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate, br");
  Header header3 = new BasicHeader(HttpHeaders.ACCEPT_LANGUAGE, "en-US,en;q=0.5");
  Header header4 = new BasicHeader(HttpHeaders.ACCEPT,
    "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
  Header header5 = new BasicHeader(HttpHeaders.CONNECTION, "keep-alive");
  Header header6 = new BasicHeader(HttpHeaders.CACHE_CONTROL, "max-age=0");
  Header header7 = new BasicHeader(HttpHeaders.USER_AGENT,
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0");
  Header header8 = new BasicHeader(HttpHeaders.HOST, "http://www.google.com");

  List<Header> headers = Arrays.asList(header1, header2, header3, header4, header5, header6, header7, header8);
  HttpClient client = HttpClients.custom().setDefaultHeaders(headers).build();
  HttpUriRequest request = RequestBuilder.get().setUri(URI).build();
  client.execute(request);

 }

}

If you want to add additional headers in a request, you can then using the setHeader() method on a particular request.

5. Custom HTTP Header Exceptions


If you try to access any of unsupported operations such as client.getParams().

HttpParams allHeaders = client.getParams();

The above code produces the below error.

Exception in thread "main" java.lang.UnsupportedOperationException
 at org.apache.http.impl.client.InternalHttpClient.getParams(InternalHttpClient.java:211)
 at com.java.w3schools.blog.HttpClient.HttpHeaderSetHeaderExample4_3Before.main(HttpHeaderSetHeaderExample4_3Before.java:40)

6. Conclusion


In this article, We've seen how to set the custom header information to the HTTP Request.

Example programs to set HTTP headers on each request in version 4.3 and above. And also setting up default to all requests in a client.

The examples shown are available over GitHub

GitHub Code

Ref for Request Headers

Ref 2

No comments:

Post a Comment

Please do not add any spam links in the comments section.