webclient将动态请求主体作为json传递

db2dz4w8  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(539)

我想在通过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);

谢谢您

7gs2gvoe

7gs2gvoe1#

只需将主体作为map传递,在body中可以将其Map到map.class或object类。根据您的要求,您也可以传递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);
jk9hmnmh

jk9hmnmh2#

如果已经有完整的请求正文,可以使用快捷方式方法 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-客户主体
注意:您也可以使用快捷方式 contentType(MediaType.APPLICATION_JSON) 而不是 header("Content-Type", MediaType.APPLICATION_JSON)

相关问题