1. Overview
This quick tutorial will show how to configure the Apache HttpClient to automatically follow redirects for POST requests.
If you want to dig deeper and learn other cool things you can do with the HttpClient – head on over to the main HttpClient tutorial.
2. Redirecting on HTTP POST
2.1. For HttpClient 5.x
By default, both GET and POST requests resulting in a redirect are automatically followed. This functionality is different from the previous version(4.5.x) which we will showcase in the next section.
@Test
void givenRedirectingPOST_whenUsingDefaultRedirectStrategy_thenRedirected() throws IOException {
final HttpPost request = new HttpPost("http://t.co/I5YYd9tddw");
try (CloseableHttpClient httpClient = HttpClientBuilder.create()
.setRedirectStrategy(new DefaultRedirectStrategy())
.build()) {
httpClient.execute(request, response -> {
assertThat(response.getCode(), equalTo(200));
return response;
});
}
}
Notice that, with the DefaultRedirectStrategy and the redirect is followed over POST – leading to a 200 OK status code.
Even if we do not use the new DefaultRedirectStrategy() the redirect is followed:
@Test
void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected() throws IOException {
final HttpPost request = new HttpPost("http://t.co/I5YYd9tddw");
try (CloseableHttpClient httpClient = HttpClientBuilder.create()
.build()) {
httpClient.execute(request, response -> {
assertThat(response.getCode(), equalTo(200));
return response;
});
}
}
2.2. For HttpClient 4.5
In HttpClient 4.5 , by default, only GET requests resulting in a redirect are automatically followed. If a POST request is answered with either HTTP 301 Moved Permanently or with 302 Found – the redirect is not automatically followed.
This is specified by the HTTP RFC 2616:
If the 301 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.
There are of course use cases where we need to change that behaviour and relax the strict HTTP specification.
First, let’s check the default behaviour:
@Test
public void givenPostRequest_whenConsumingUrlWhichRedirects_thenNotRedirected()
throws ClientProtocolException, IOException {
HttpClient instance = HttpClientBuilder.create().build();
HttpResponse response = instance.execute(new HttpPost("http://t.co/I5YYd9tddw"));
assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}
As you can see, the redirect is not followed by default, and we get back the 301 Status Code.
Let’s now see how we can follow redirects by setting a Redirect Strategy:
@Test
public void givenRedirectingPOST_whenConsumingUrlWhichRedirectsWithPOST_thenRedirected()
throws ClientProtocolException, IOException {
HttpClient instance =
HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
HttpResponse response = instance.execute(new HttpPost("http://t.co/I5YYd9tddw"));
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
}
With the LaxRedirectStrategy, the HTTP Restrictions are relaxed and the redirect is followed over POST as well – leading to a 200 OK status code.
3. Conclusion
This quick guide illustrated how to configure any version of the Apache HttpClient to follow redirects for HTTP POST requests as well – relaxing the strict HTTP standard.
The implementation of all these examples and code snippets can be found in the GitHub project – this is an Eclipse-based project, so it should be easy to import and run as it is.
For HttpClient 4.x code snippets, please refer to our HttpClient 4 module.