programing

사후 대응적인 Web Client가 3XX 리다이렉트를 따르도록 하려면 어떻게 해야 합니까?

mailnote 2023. 3. 22. 21:49
반응형

사후 대응적인 Web Client가 3XX 리다이렉트를 따르도록 하려면 어떻게 해야 합니까?

spring-boot 2에서 netty를 사용하여 reactive Webclient를 사용하여 요청을 하는 기본 REST 컨트롤러를 만들었습니다.

@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을 사용하여 리다이렉트를 추적하고 3XX 이외의 응답을 얻을 때까지 해당 URI를 재귀적으로 호출합니다.

실제 결과는 3XX 응답입니다.

문서별로 클라이언트를 설정해야 합니다.

           WebClient.builder()
                    .clientConnector(new ReactorClientHttpConnector(
                            HttpClient.create().followRedirect(true)
                    ))

함수의 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);
            }

언급URL : https://stackoverflow.com/questions/47655789/how-to-make-reactive-webclient-follow-3xx-redirects

반응형