/*
 * Copyright 2002-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.http.client;

import java.io.IOException;

import org.springframework.http.HttpRequest;

Intercepts client-side HTTP requests. Implementations of this interface can be registered with the RestTemplate, as to modify the outgoing ClientHttpRequest and/or the incoming ClientHttpResponse.

The main entry point for interceptors is intercept(HttpRequest, byte[], ClientHttpRequestExecution).

Author:Arjen Poutsma
Since:3.1
/** * Intercepts client-side HTTP requests. Implementations of this interface can be * {@linkplain org.springframework.web.client.RestTemplate#setInterceptors registered} * with the {@link org.springframework.web.client.RestTemplate RestTemplate}, * as to modify the outgoing {@link ClientHttpRequest} and/or the incoming * {@link ClientHttpResponse}. * * <p>The main entry point for interceptors is * {@link #intercept(HttpRequest, byte[], ClientHttpRequestExecution)}. * * @author Arjen Poutsma * @since 3.1 */
@FunctionalInterface public interface ClientHttpRequestInterceptor {
Intercept the given request, and return a response. The given ClientHttpRequestExecution allows the interceptor to pass on the request and response to the next entity in the chain.

A typical implementation of this method would follow the following pattern:

  1. Examine the request and body
  2. Optionally wrap the request to filter HTTP attributes.
  3. Optionally modify the body of the request.
  4. Either
  5. Optionally wrap the response to filter HTTP attributes.
Params:
  • request – the request, containing method, URI, and headers
  • body – the body of the request
  • execution – the request execution
Throws:
Returns:the response
/** * Intercept the given request, and return a response. The given * {@link ClientHttpRequestExecution} allows the interceptor to pass on the * request and response to the next entity in the chain. * <p>A typical implementation of this method would follow the following pattern: * <ol> * <li>Examine the {@linkplain HttpRequest request} and body</li> * <li>Optionally {@linkplain org.springframework.http.client.support.HttpRequestWrapper * wrap} the request to filter HTTP attributes.</li> * <li>Optionally modify the body of the request.</li> * <li><strong>Either</strong> * <ul> * <li>execute the request using * {@link ClientHttpRequestExecution#execute(org.springframework.http.HttpRequest, byte[])},</li> * <strong>or</strong> * <li>do not execute the request to block the execution altogether.</li> * </ul> * <li>Optionally wrap the response to filter HTTP attributes.</li> * </ol> * @param request the request, containing method, URI, and headers * @param body the body of the request * @param execution the request execution * @return the response * @throws IOException in case of I/O errors */
ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException; }