добавление токена JWT в запрос реактивным способом в webflux - PullRequest
0 голосов
/ 17 февраля 2020

Я использую WebClient для вызова Rest API, который защищен токеном JWT. // Для получения токена

JwtToken token = client.post()
                .uri("")
                .body(BodyInserters.fromFormData("username", "XXX")
                        .with("password", "XXXXX"))
                .retrieve()
                .bodyToFlux(JwtToken.class)
                .onErrorMap(e -> new Exception("Error While getting Token", e))
                .blockLast(); 

// Вызов безопасного API

 WebClient client = consorsWebClientBuilder
                .defaultHeaders(token.bearer())
                .build();

              client
                .get()
                .uri(someURI)
                .retrieve()
                .bodyToMono(String.class)

я звоню Block в реактивной цепочке, поэтому веб-поток не устраивает и он говорит, что

block () / blockFirst () / blockLast () являются блокирующими, что не поддерживается в thread processor-http-client-epoll-12

Как добавить токен реактивным способом? Обратите внимание, я могу создать фильтр, но все еще в фильтре, и мне нужно позвонить Block

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

вы можете использовать doOnSuccess

client.post()
      .uri("")
      .body(BodyInserters.fromFormData("username", "XXX")
                    .with("password", "XXXXX"))
      .retrieve()
      .bodyToFlux(JwtToken.class)
      .onErrorMap(e -> new Exception("Error While getting Token", e))
      .doOnSuccess(jwtToken -> {
                client.header(HttpHeaders.AUTHORIZATION, "bearer " + jwtToken)
                      .get()
                      ...
      })
0 голосов
/ 18 февраля 2020
I used map for this, not the best solution but does the work

Mono<JwtToken>  token = client.post()
                .uri("")
                .body(BodyInserters.fromFormData("username", "XXX")
                        .with("password", "XXXXX"))
                .retrieve()
                .bodyToMon(JwtToken.class)
                .onErrorMap(e -> new Exception("Error While getting Token", e))


return token
     .flatMap(token -> callApi(request, token));
...