26

netty を使用して、Spring-boot 2 のリアクティブ Web クライアントを使用してリクエストを行う基本的な 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 応答コードが戻ってきたら、Web クライアントが応答の Location を使用してリダイレクトに従い、非 3XX 応答を取得するまでその URI を再帰的に呼び出すようにします。

私が得る実際の結果は 3XX 応答です。

4

2 に答える 2

40

ドキュメントに従ってクライアントを構成する必要があります

           WebClient.builder()
                    .clientConnector(new ReactorClientHttpConnector(
                            HttpClient.create().followRedirect(true)
                    ))
于 2019-01-31T19:16:05.857 に答える
7

関数の 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);
            }
于 2018-06-07T11:46:35.763 に答える