WebClient是Spring Framework中提供的提供一种简单的HTTP访问客户端的API,通过WebClient可以完成HTTP的GET、POST、PUT、DELETE等请求操作。在使用WebClient发送请求时,常常会遇到MediaType不支持的异常,本文将介绍如何解决这个异常。
1. 什么是UnsupportedMediaTypeException异常?
当使用Spring WebClient访问API时,如果请求头中的Content-Type不被API所支持,那么API会返回一个UnsupportedMediaTypeException异常。
2. 解决UnsupportedMediaTypeException异常的方法
解决UnsupportedMediaTypeException异常的方法分为两种:一种是修改发送请求的数据格式,另一种则是修改接收响应的数据格式。
2.1 修改发送请求的数据格式
一般来说,WebClient发送请求的数据格式主要有三种:application/json、application/x-www-form-urlencoded和multipart/form-data。
修改Content-Type为application/json:
WebClient.builder().baseUrl("http://example.com")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build()
.post()
.uri(uriBuilder -> uriBuilder.path("/api/path").build())
.bodyValue(requestBody)
.retrieve()
.bodyToMono(Response.class)
.block();
修改Content-Type为application/x-www-form-urlencoded:
WebClient.builder().baseUrl("http://example.com")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
.build()
.post()
.uri(uriBuilder -> uriBuilder.path("/api/path").build())
.bodyValue(requestBody)
.retrieve()
.bodyToMono(Response.class)
.block();
修改Content-Type为multipart/form-data:
MultiValueMap<String, Object> files = new LinkedMultiValueMap<>();
files.add("name", multipartFileResource);
WebClient.builder().baseUrl("http://example.com")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.build()
.post()
.uri(uriBuilder -> uriBuilder.path("/api/path").build())
.body(BodyInserters.fromMultipartData(files))
.retrieve()
.bodyToMono(Response.class)
.block();
2.2 修改接收响应的数据格式
解决UnsupportedMediaTypeException异常的另一种方法是修改接收响应的数据格式。一般来说,响应格式主要有application/json、application/xml、text/plain等格式,如果接口返回的Content-Type与WebClient默认的格式不同,就会抛出UnsupportedMediaTypeException异常。
修改接收响应的格式为application/json:
WebClient.builder().baseUrl("http://example.com")
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.build()
.get()
.uri(uriBuilder -> uriBuilder.path("/api/path").build())
.retrieve()
.bodyToMono(Response.class)
.block();
修改接收响应的格式为application/xml:
WebClient.builder().baseUrl("http://example.com")
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_VALUE)
.build()
.get()
.uri(uriBuilder -> uriBuilder.path("/api/path").build())
.retrieve()
.bodyToMono(Response.class)
.block();
3. 示例说明
下面通过一个实例说明如何解决UnsupportedMediaTypeException异常。
假设我们要通过WebClient发送POST请求到一个API,请求数据为以下格式:
{
"name": "test"
}
API要求请求头中的Content-Type为application/json。
请求示例代码:
WebClient.builder().baseUrl("http://example.com")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build()
.post()
.uri(uriBuilder -> uriBuilder.path("/api/path").build())
.bodyValue("{\"name\": \"test\"}")
.retrieve()
.bodyToMono(Response.class)
.block();
如果请求数据格式不正确,比如设置Content-Type为text/plain,或者请求体中不是JSON格式的数据,API就会返回UnsupportedMediaTypeException异常。此时,可以调整Content-Type为正确的格式,或者修改请求体中的数据格式。
例如,修改Content-Type为正确的格式,示例代码为:
WebClient.builder().baseUrl("http://example.com")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build()
.post()
.uri(uriBuilder -> uriBuilder.path("/api/path").build())
.bodyValue("{\"name\": \"test\"}")
.retrieve()
.bodyToMono(Response.class)
.block();
以上就是解决WebClient抛UnsupportedMediaTypeException异常的完整攻略,无论是修改请求数据格式还是修改响应数据格式,都需要注意Content-Type的设置。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WebClient抛UnsupportedMediaTypeException异常解决 - Python技术站