programing

Spring Web Client에서 여러 헤더를 동시에 설정하는 방법

oldcodes 2023. 4. 4. 22:16
반응형

Spring Web Client에서 여러 헤더를 동시에 설정하는 방법

나머지 클라이언트에 머리글을 설정하려고 했는데 매번 다음 명령을 써야 합니다.

webclient.get().uri("blah-blah")
         .header("key1", "value1")
         .header("key2", "value2")...

headers() 메서드를 사용하여 모든 헤더를 동시에 설정하려면 어떻게 해야 합니까?

이러한 헤더가 요청별로 변경될 경우 다음을 사용할 수 있습니다.

webClient.get().uri("/resource").headers(httpHeaders -> {
    httpHeaders.setX("");
    httpHeaders.setY("");
});

이렇게 하면 입력이 크게 절약되지 않으므로 요청 간에 변경되지 않는 헤더의 경우 클라이언트를 빌드할 때 이러한 헤더를 기본 헤더로 설정할 수 있습니다.

WebClient webClient = WebClient.builder().defaultHeader("...", "...").build();
WebClient webClient = WebClient.builder().defaultHeaders(httpHeaders -> {
    httpHeaders.setX("");
    httpHeaders.setY("");
}).build();

헤더를 사용한 작업을 마친 후 Web Client 구축에서 추가 fluent-composition 메서드 호출을 계속할 수 있다는 점에서 시각화하는 것은 어렵지만 소비자가 옳습니다.

......범위에 헤더를 보관하고 있는HttpHeaders(또는 MutliValue 맵)가 있다고 가정합니다.다음은 스프링 클라우드 게이트웨이에서 Exchange 개체를 사용하는 예입니다.

final HttpHeaders headersFromExchangeRequest = exchange.getRequest().headers();
webclient.get().uri("blah-blah")
    .headers( httpHeadersOnWebClientBeingBuilt -> { 
         httpHeadersOnWebClientBeingBuilt.addAll( headersFromExchangeRequest );
    }
)...

addAll은 다중값 맵을 사용할 수 있습니다.이것이 타당하다면 IDE를 가이드로 해 주세요.

소비자를 명확하게 하기 위해서, 상기의 내용을 다음과 같이 고쳐 씁니다.

private Consumer<HttpHeaders> getHttpHeadersFromExchange(ServerWebExchange exchange) {
    return httpHeaders -> {
        httpHeaders.addAll(exchange.getRequest().getHeaders());
    };
}
.
.
.
webclient.get().uri("blah-blah")
    .headers(getHttpHeadersFromExchange(exchange))
    ...

저는 이 문제가 다시 제기되어 이번에는 WebClient를 사용하여 직접 groovy를 작성했습니다.다시 말씀드리지만, 이 예에서는 Consumer를 헤더 메서드 호출의 인수로 사용하고 있습니다.

그루비에서는 그루비 클로저 구문과 자바 람다 구문이 모두 사용된다는 추가 문제가 있습니다.->

groovy 버전은 다음과 같습니다.

def mvmap = new LinkedMultiValueMap<>(headersAsMap)
def consumer = { it -> it.addAll(mvmap) } as Consumer<HttpHeaders>

WebClient client = WebClient.create(baseUrlAsString)
def resultAsMono = client.post()
        .uri(uriAsString).accept(MediaType.APPLICATION_JSON)
        .headers(consumer)
        .body(Mono.just(payload), HashMap.class)
        .retrieve()
        .toEntity(HashMap.class)

Java 버전은 다음과 같습니다.

LinkedMultiValueMap mvmap = new LinkedMultiValueMap<>(headersAsMap);
Consumer<HttpHeaders> consumer = it -> it.addAll(mvmap);

WebClient client = WebClient.create(baseUrlAsString);
Mono<ResponseEntity<HashMap>> resultAsMono = client.post()
        .uri(uriAsString).accept(MediaType.APPLICATION_JSON)
        .headers(consumer)
        .body(Mono.just(payload), HashMap.class)
        .retrieve()
        .toEntity(HashMap.class);

스프링 부트 중2.7.5:

webClient
  .get()
    .uri("blah-blah")
      .headers(
        httpHeaders -> {
          httpHeaders.set("key1", "value1");
          httpHeaders.set("key2", "value2");
        })

언급URL : https://stackoverflow.com/questions/59133508/how-to-set-multiple-headers-at-once-in-spring-webclient

반응형