Spring WebClient 将动态请求正文作为 JSON

Spring WebClient pass dynamic request body as JSON

我想在通过 WebClient 进行 API 调用时传递通用请求正文。我在数据库中有动态键值对,例如(key1-value1,key2-value2,key3-value3)。此键值可能会增大或缩小。

有没有什么方法可以通过 JSON 请求正文调用 API 动态数据?

webClient.post().uri(uri).header(CONTENT_TYPE, APPLICATION_JSON)
            .body({DYANAMIC JSON}).retrieve().onStatus(HttpStatus::isError, clientResponse -> {
                return Mono.error(new Exception("error"));
            }).bodyToMono(String.class);

谢谢

您可以将正文作为地图传递,在正文中您可以将其映射到 Map.class 或对象 class。 根据您的要求,您也可以传递 JsonObject。

Map<String, String> r = new HashMap<>();
    webClient.post().uri(uri).header(CONTENT_TYPE, APPLICATION_JSON)
                    .body(Mono.just(r), Map.class).retrieve().onStatus(HttpStatus::isError, clientResponse -> {
                        return Mono.error(new Exception("error"));
                    }).bodyToMono(String.class);

如果您已经有了完整的请求正文,可以使用快捷方式bodyValue

Object requestBody = ...;
webClient.post()
    .uri(uri)
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(requestBody)
    .retrieve()
    .onStatus(HttpStatus::isError, clientResponse -> {
        return Mono.error(new Exception("error"));
    })
    .bodyToMono(String.class);

此处的文档中描述了插入请求正文:https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-client-body

注意:您也可以使用快捷方式 contentType(MediaType.APPLICATION_JSON) 而不是 header("Content-Type", MediaType.APPLICATION_JSON)