繁体   English   中英

如何将 Spring Webclient 的内容类型设置为“application/json-patch+json”

[英]How do I set Content type for Spring Webclient to "application/json-patch+json"

我正在尝试向另一个接受内容类型“application/json-patch+json”的 API 发出补丁休息请求。 我正在使用 Spring 的 webclient,但我无法让它工作。 我不断收到“415 Unsupported media type”

我试过以下;

WebClient webClient = WebClient.create(baseUrl);
Mono<ClientResponse> response = webClient.patch()
  .uri(updateVmfExecutionApi, uuid)
  .header("Content-Type", "application/json-patch+json")
  .body(BodyInserters.fromFormData("lastKnownState", state))
  .exchange();

我也试过:

WebClient webClient = WebClient.create(baseUrl);
    Mono<ClientResponse> response = webClient.patch()
      .uri(updateVmfExecutionApi, uuid)
      .contentType(MediaType.valueOf("application/json-patch+json"))
      .body(BodyInserters.fromFormData("lastKnownState", state))
      .exchange();

对于这两种情况,我看到以下错误;

 {"timestamp":"2020-09-17T20:50:40.818+0000","status":415,"error":"Unsupported Media Type","exception":"org.springframework.web.HttpMediaTypeNotSupportedException","message":"Unsupported Media Type","trace":"org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:215)\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:421)\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getHandlerInternal(RequestMappingHandlerMapping.java:449)

似乎它更改为 'application/x-www-form-urlencoded;charset=UTF-8' 是否可以将 webclient 用于此内容类型?

如果您查看异常,您可以看到它说

Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

它把它改成了formdata。 那是因为您实际发送到正文中的内容具有优先权。 在您的代码中,您要说明以下内容以发送正文。

.body(BodyInserters.fromFormData("lastKnownState", state))

这表明您正在发送表单数据,这是发送数据的键值方式,然后 webclient 会自动为您设置内容类型标头为x-www-form-urlencoded

如果你想要一个 json 内容类型头,你需要发送 json 数据。 发送 json 是 webclient 的默认方式,因此您需要做的就是正确传递正文。 有几种方法可以以标准方式传递身体。

通过传递生产者(可以是MonoFlux )。

.body(Mono.just(data))

使用BodyInserter#fromValue

.body(BodyInserters.fromValue(data))

或前一个的简写(这是最简单的)

.bodyValue(data)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM