如何在spring-boot web客户端发送请求体?

问题描述 投票:0回答:4

我在 Spring Boot Web 客户端发送请求正文时遇到一些问题。尝试发送如下所示的正文:

val body = "{\n" +
            "\"email\":\"[email protected]\",\n" +
            "\"id\":1\n" +
            "}"
val response = webClient.post()
    .uri( "test_uri" )
    .accept(MediaType.APPLICATION_JSON)
    .body(BodyInserters.fromObject(body))
    .exchange()
    .block()

它不起作用。 请求正文应为 JSON 格式。 请让我知道我哪里做错了。

spring-boot kotlin webclient spring-webflux
4个回答
34
投票

您没有设置

"Content-Type"
请求标头,因此您需要将
.contentType(MediaType.APPLICATION_JSON)
附加到请求构建部分。


22
投票

上面的答案是正确的:在

application/json
标头中添加
Content-Type
可以解决问题。不过,在这个答案中,我想提一下
BodyInserters.fromObject(body)
已被弃用。从 Spring Framework 5.2 开始,建议使用
BodyInserters.fromValue(body)


1
投票

您可以尝试如下:

public String wcPost(){

    Map<String, String> bodyMap = new HashMap();
    bodyMap.put("key1","value1");
 

    WebClient client = WebClient.builder()
            .baseUrl("domainURL")
            .build();


    String responseSpec = client.post()
            .uri("URI")
            .headers(h -> h.setBearerAuth("token if any"))
            .body(BodyInserters.fromValue(bodyMap))
            .exchange()
            .flatMap(clientResponse -> {
                if (clientResponse.statusCode().is5xxServerError()) {
                    clientResponse.body((clientHttpResponse, context) -> {
                        return clientHttpResponse.getBody();
                    });
                    return clientResponse.bodyToMono(String.class);
                }
                else
                    return clientResponse.bodyToMono(String.class);
            })
            .block();

    return responseSpec;
}

0
投票

添加内容类型对我来说还不够(我正在使用 Kotlin)。试试这个而不是 BodyInserters:

.body(Mono.just(body), String::class.java)

© www.soinside.com 2019 - 2024. All rights reserved.