带有 Cookie 的 RestTemplate 客户端

2022-09-01 05:55:51

我正在用Java编写一个简单的客户端,以允许通过RESTful API访问专有病毒扫描软件的可重用使用。要上传文件以进行扫描,API 需要 一个 for Connect,后跟 一个用于将文件发布到服务器。在对 Connect 的响应中,有服务器设置的 Cookie,这些 Cookie 需要存在于后续文件中才能发布文件。我目前正在我的客户端中使用Spring。POSTPOSTPOSTPOSTRestTemplate

我的问题是我如何访问响应中的cookie以转发回服务器以及随后的cookie?我可以看到它们存在于返回的标头中,但是上没有访问它们的方法。POSTResponseEntity


答案 1

RestTemplate有一个方法,您可以在其中定义接口 ,此接口用于获取响应的标头,一旦您拥有它们,您就可以将其发送回去并再次添加。ResponseExtractor<T>HttpEntity

 .add("Cookie", "SERVERID=c52");

试试这样的东西。

String cookieHeader = null;

new ResponseExtractor<T>(){
      T extractData(ClientHttpResponse response) {
        response.getHeaders();
      }
}

然后

  HttpHeaders headers = new HttpHeaders();
  headers.add("Cookie", cookieHeader );

  ResponseEntity<byte[]> response = restTemplate.exchange("http://example.com/file/123",
      GET,
      new HttpEntity<String>(headers),
      byte[].class);

另请阅读这篇文章


答案 2

我通过创建一个拦截器来解决这个问题,该拦截器存储一个cookie并将其放入下一个请求中。

public class StatefulRestTemplateInterceptor implements ClientHttpRequestInterceptor {
    private String cookie;

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        if (cookie != null) {
            request.getHeaders().add(HttpHeaders.COOKIE, cookie);
        }
        ClientHttpResponse response = execution.execute(request, body);

        if (cookie == null) {
            cookie = response.getHeaders().getFirst(HttpHeaders.SET_COOKIE);
        }
        return response;
    }
}

为 RestTemplate 设置拦截器:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder templateBuilder) {
    return templateBuilder
            .requestFactory(new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory()))
            .interceptors(new StatefulRestTemplateInterceptor())
            .build();
}

推荐