The HTTP protocol interceptor plays a crucial role in implementing specific aspects of the HTTP protocol. Typically, interceptors handle individual or groups of related headers in incoming or outgoing messages. They may also manipulate content entities enclosed within messages, often utilizing the 'Decorator' pattern to wrap the original entity.
To ensure thread safety, protocol interceptors must be implemented carefully, avoiding the use of instance variables unless synchronized.
The HttpRequestInterceptor interface features a process method with the following signature:
void process(HttpRequest request,
EntityDetails entity,
HttpContext context) throws HttpException, IOException
This method handles request processing. On the client side, it occurs before sending the request to the server, while on the server side, it operates on incoming messages before evaluating the message body. The parameters include the request itself, entity details (or null if unavailable), and the context for the request.
Define a request interceptor
private static class RequestInterceptor implements HttpRequestInterceptor {
@Override
public void process(HttpRequest request, EntityDetails entity, HttpContext context)
throws HttpException, IOException {
request.setHeader("static_secret", "secret123");
}
}
Add Request interceptor while defining the client.
CloseableHttpClient httpClient = HttpClients
.custom()
.addRequestInterceptorFirst(new RequestInterceptor())
.build();
Find the below working application.
RequestInterceptorDemo.java
package com.sample.app.httpclient;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.ClassicHttpRequest;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.EntityDetails;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.HttpException;
import org.apache.hc.core5.http.HttpRequest;
import org.apache.hc.core5.http.HttpRequestInterceptor;
import org.apache.hc.core5.http.ParseException;
import org.apache.hc.core5.http.io.HttpClientResponseHandler;
import org.apache.hc.core5.http.protocol.HttpContext;
public class RequestInterceptorDemo {
private static class RequestInterceptor implements HttpRequestInterceptor {
@Override
public void process(HttpRequest request, EntityDetails entity, HttpContext context)
throws HttpException, IOException {
request.setHeader("static_secret", "secret123");
}
}
private static HttpClientResponseHandler<String> responseHandler = new HttpClientResponseHandler<String>() {
@Override
public String handleResponse(final ClassicHttpResponse response) throws IOException, ParseException {
HttpEntity httpEntity = response.getEntity();
try (InputStream is = httpEntity.getContent()) {
return inputStreamToString(is, StandardCharsets.UTF_8);
}
}
};
private static String inputStreamToString(InputStream inputStream, Charset charSet) throws IOException {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charSet))) {
return reader.lines().collect(Collectors.joining("\n"));
}
}
public static void main(String[] args) {
try (CloseableHttpClient httpClient = HttpClients.custom().addRequestInterceptorFirst(new RequestInterceptor())
.build()) {
ClassicHttpRequest request = new HttpGet("http://localhost:8080/api/v1/replay-request");
String response = httpClient.execute(request, responseHandler);
System.out.println(response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Output
{"headers":{"host":"localhost:8080","static_secret":"secret123","connection":"keep-alive","accept-encoding":"gzip, x-gzip, deflate","user-agent":"Apache-HttpClient/5.3.1 (Java/1.8.0_333)"},"parameters":{},"attributes":{},"payload":""}
Methods summary
public final HttpClientBuilder addRequestInterceptorFirst(final HttpRequestInterceptor interceptor)
Adds the interceptor to the beginning of the chain, ensuring it's the first to process requests.
public final HttpClientBuilder addRequestInterceptorLast(final HttpRequestInterceptor interceptor)
Adds the interceptor to the end of the chain, so it processes requests after all other interceptors. Previous Next Home
No comments:
Post a Comment