简短的问题:,如何在自动连接RestTemplate之后将动态值传递给Spring REST拦截器?

现在详细说明:

我有一个Spring REST拦截器,如下所示:

public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor  {

  private final String headerName;

  private final String headerValue;

  public HeaderRequestInterceptor(final String headerName, final String headerValue) {
    this.headerName = headerName;
    this.headerValue = headerValue;
  }

  public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
    HttpRequest wrapper = new HttpRequestWrapper(request);
    wrapper.getHeaders().set(headerName, headerValue);
    return execution.execute(wrapper, body);
  }
}

然后,使用上述拦截器按如下方式配置RestTemplate:
@Bean
 public RestTemplate getRestTemplate() {
    List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
    interceptors.add(new HeaderRequestInterceptor(<<MY-CUSTOM-HEADER>>, <<MY-DYNAMIC-VALUE>>));

    final RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
    restTemplate.setInterceptors(interceptors);
    return restTemplate;
}

请看看我创建拦截器的方式。 MY-CUSTOM-HEADER是一个常数,但是MY-DYNAMIC-VALUE可以针对每个请求进行更改。如何使拦截器具有动态价值?

PS:这是一个独立的spring应用程序(不是Web)。这是一种用于进行REST调用的客户端库。

最佳答案

如果每个请求的标头是动态的,我看不到拦截器的用法。
RestTemplate上基于请求的范围bean可以解决此问题,但它会为每个请求创建RestTemplate对象。

只需使用addHeader()方法添加一个名为HttpRequestHeaderUtils.java的静态实用程序类,然后在调用RestTemplate方法之前对其进行调用,或者将其包装在您自己的CustomRestTemplate上以委派所有RestTemplate调用以具有单个实现。

CustomRestTemplate extends RestTemplate{


}
HttpRequestHeaderUtils.java
public static void addHeader(final HttpRequest request, final String headerName, final String headerValue)
  HttpRequest wrapper = new HttpRequestWrapper(request);
  wrapper.getHeaders().set(headerName, headerValue);
}

如果您仍想使用拦截器,则可以劫持您的拦截方法
通过将动态值存储为请求属性(不干净,与直接设置标头相同)
public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
    HttpRequest wrapper = new HttpRequestWrapper(request);
    final String dynamicHeaderValue = request.getAttribute("myDynamicHeaderValue");
    wrapper.getHeaders().set(headerName, dynamicHeaderValue!=null? dynamicHeaderValue : headerValue );
    return execution.execute(wrapper, body);
  }

10-05 20:43
查看更多