问题描述
我正在尝试向另一个接受内容类型为“ application / json-patch + json”的API发出补丁暂停请求。我正在使用Spring的webclient,但无法使其正常工作。我不断收到“ 415不支持的媒体类型”
我尝试了以下方法;
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是网络客户端的默认方式,因此您所需要做的就是正确地传递正文。有几种方法可以通过标准方式传递身体。
通过传递生产者(可以是Mono
或Flux
)。
.body(Mono.just(data))
使用BodyInserter#fromValue
。
.body(BodyInserters.fromValue(data))
或上一个的简写(这是最简单的)
.bodyValue(data)