Enterprise Java

Custom HTTP Header with the HttpClient

A quick guide to set custom HTTP Header in Apache HTTPClient request. On HttpRequest call setHeader() method to set HttpHeaders content type as JSON. Covered for various versions of HttpClient (4.3 before and after).

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?”

2. Set 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 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. 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

Published on Java Code Geeks with permission by Venkatesh Nukala, partner at our JCG program. See the original article here: Custom HTTP Header with the HttpClient

Opinions expressed by Java Code Geeks contributors are their own.

Venkatesh Nukala

Venkatesh Nukala is a Software Engineer working for Online Payments Industry Leading company. In my free time, I would love to spend time with family and write articles on technical blogs. More on JavaProgramTo.com
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button