如何在 Spring WebClient 请求之间保存 cookie?
How can I save cookies between Spring WebClient requests?
我想在我的项目中使用 Spring Boot WebClient 来访问 REST-API。第一个请求执行登录到 REST-API 并接收一个 cookie 作为响应。此 cookie 用作所有其他请求的“API-令牌”。
但是,WebClient 似乎没有存储cookie。我必须自己做吗?如果是这样,最好的方法是什么?
以下是我的示例源代码。第二个请求不使用第一个请求中的 cookie。
// ### 1. API-Call to get the cookie ###
ClientResponse clientResponse = webClient
.get()
.uri("/api/")
.headers(headers -> headers.setBasicAuth(user,passwd)
.exchange()
.block();
// ### Debug Cookie ###
if (clientResponse.statusCode().is2xxSuccessful()) {
for (String key : clientResponse.cookies().keySet()) {
LOG.debug("key:" + key + " value: " + clientResponse.cookies().get(key).get(0).getValue() );
}
}
// ### 2.API-Call (with cookie) ###
webClient
.get()
.uri("/api/document/4711")
.retrieve()
.onStatus(HttpStatus::is2xxSuccessful, r -> {
for (String key : r.cookies().keySet()) {
LOG.debug("key:" + r.cookies().get(key).get(0).getValue());
}
return Mono.empty();
})
.onStatus(HttpStatus::is4xxClientError, r -> {
System.out.println("2 4xx error");
for (String key : r.cookies().keySet()) {
LOG.debug("key:" + r.cookies().get(key).get(0).getValue());
}
return Mono.error(new RuntimeException("" + r.statusCode().value()));
})
.onStatus(HttpStatus::is5xxServerError, response -> {
LOG.error("2 5xx error");
return Mono.error(new RuntimeException("5xx"));
})
.bodyToMono(String.class)
.block();
为了存储 cookie,我们更改为 Jetty HttpClient (org.eclipse.jetty.client.HttpClient)。
查看此答案以了解如何启用它:。
我想在我的项目中使用 Spring Boot WebClient 来访问 REST-API。第一个请求执行登录到 REST-API 并接收一个 cookie 作为响应。此 cookie 用作所有其他请求的“API-令牌”。
但是,WebClient 似乎没有存储cookie。我必须自己做吗?如果是这样,最好的方法是什么?
以下是我的示例源代码。第二个请求不使用第一个请求中的 cookie。
// ### 1. API-Call to get the cookie ###
ClientResponse clientResponse = webClient
.get()
.uri("/api/")
.headers(headers -> headers.setBasicAuth(user,passwd)
.exchange()
.block();
// ### Debug Cookie ###
if (clientResponse.statusCode().is2xxSuccessful()) {
for (String key : clientResponse.cookies().keySet()) {
LOG.debug("key:" + key + " value: " + clientResponse.cookies().get(key).get(0).getValue() );
}
}
// ### 2.API-Call (with cookie) ###
webClient
.get()
.uri("/api/document/4711")
.retrieve()
.onStatus(HttpStatus::is2xxSuccessful, r -> {
for (String key : r.cookies().keySet()) {
LOG.debug("key:" + r.cookies().get(key).get(0).getValue());
}
return Mono.empty();
})
.onStatus(HttpStatus::is4xxClientError, r -> {
System.out.println("2 4xx error");
for (String key : r.cookies().keySet()) {
LOG.debug("key:" + r.cookies().get(key).get(0).getValue());
}
return Mono.error(new RuntimeException("" + r.statusCode().value()));
})
.onStatus(HttpStatus::is5xxServerError, response -> {
LOG.error("2 5xx error");
return Mono.error(new RuntimeException("5xx"));
})
.bodyToMono(String.class)
.block();
为了存储 cookie,我们更改为 Jetty HttpClient (org.eclipse.jetty.client.HttpClient)。
查看此答案以了解如何启用它: