無味
发布于 2024-04-15 / 15 阅读
0

RestTemplate 406 Not Acceptable处理

错误信息

406 Not Acceptable: [<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=... (741 bytes)]
org.springframework.web.client.HttpClientErrorException$NotAcceptable: 406 Not Acceptable: [<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=... (741 bytes)]
	at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:121)
	at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:186)
	at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:125)
	at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
	at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:818)
	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:776)
	at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:710)
	at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:467)

原因

406 Not Acceptable是一个HTTP响应状态码,指示服务器无法实现客户端的一个 Accept-标头的请求响应。这通常是用户代理(即浏览器)指定一个可接受的字符集(通过Accept-Charset)、语言(通过Accept-Language)等应响应的结果,并且服务器无法提供此类响应

406 Not Acceptable 表示用户代理(在大多数情况下是 Web 浏览器)请求了有效的资源,但请求包含一个特殊的 Accept- 标头,该标头向服务器指示有效响应只能包含特定类型的信息

出现代码

            XxxxDTO dto = XxxxDTO.builder().eauth("xx").username("xx").password("xx").build();
            ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(loginUrl, dto, JSONObject.class);

综合结论

就是查询客户端和服务器的header信息不一致。

解决方案

restTemplate时设置header。

            XxxxDTO dto = XxxxDTO.builder().eauth("xx").username("xx").password("xx").build();
            # ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(loginUrl, dto, JSONObject.class);

	    HttpHeaders headers = new HttpHeaders();
            MediaType type = MediaType.parseMediaType(ContentType.APPLICATION_JSON.getMimeType());
            headers.setContentType(type);
            org.springframework.http.HttpEntity<XxxxDTO> entity = new org.springframework.http.HttpEntity<>(dto, headers);
            ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(loginUrl, entity, JSONObject.class);

End