如何使响应式 Web 客户端遵循 3XX 重定向?
How to make reactive webclient follow 3XX-redirects?
我创建了一个基本的 REST 控制器,它使用 Spring-boot 2 中的响应式 Web 客户端使用 netty 发出请求。
@RestController
@RequestMapping("/test")
@Log4j2
public class TestController {
private WebClient client;
@PostConstruct
public void setup() {
client = WebClient.builder()
.baseUrl("http://www.google.com/")
.exchangeStrategies(ExchangeStrategies.withDefaults())
.build();
}
@GetMapping
public Mono<String> hello() throws URISyntaxException {
return client.get().retrieve().bodyToMono(String.class);
}
}
当我收到 3XX 响应代码时,我希望网络客户端使用响应中的 Location 遵循重定向并递归调用该 URI,直到我收到非 3XX 响应。
我得到的实际结果是 3XX 响应。
您可以创建函数的 URL 参数,并在获得 3XX 响应时递归调用它。像这样(在实际实现中你可能想限制重定向的数量):
public Mono<String> hello(String uri) throws URISyntaxException {
return client.get()
.uri(uri)
.exchange()
.flatMap(response -> {
if (response.statusCode().is3xxRedirection()) {
String redirectUrl = response.headers().header("Location").get(0);
return response.bodyToMono(Void.class).then(hello(redirectUrl));
}
return response.bodyToMono(String.class);
}
您需要根据 docs
配置客户端
WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(
HttpClient.create().followRedirect(true)
))
我创建了一个基本的 REST 控制器,它使用 Spring-boot 2 中的响应式 Web 客户端使用 netty 发出请求。
@RestController
@RequestMapping("/test")
@Log4j2
public class TestController {
private WebClient client;
@PostConstruct
public void setup() {
client = WebClient.builder()
.baseUrl("http://www.google.com/")
.exchangeStrategies(ExchangeStrategies.withDefaults())
.build();
}
@GetMapping
public Mono<String> hello() throws URISyntaxException {
return client.get().retrieve().bodyToMono(String.class);
}
}
当我收到 3XX 响应代码时,我希望网络客户端使用响应中的 Location 遵循重定向并递归调用该 URI,直到我收到非 3XX 响应。
我得到的实际结果是 3XX 响应。
您可以创建函数的 URL 参数,并在获得 3XX 响应时递归调用它。像这样(在实际实现中你可能想限制重定向的数量):
public Mono<String> hello(String uri) throws URISyntaxException {
return client.get()
.uri(uri)
.exchange()
.flatMap(response -> {
if (response.statusCode().is3xxRedirection()) {
String redirectUrl = response.headers().header("Location").get(0);
return response.bodyToMono(Void.class).then(hello(redirectUrl));
}
return response.bodyToMono(String.class);
}
您需要根据 docs
配置客户端 WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(
HttpClient.create().followRedirect(true)
))