我有一个生成 MediaType.APPLICATION_XML_VALUE
的Web服务在其余客户端中,我看到内容类型标头为 application / xml; charset = ISO-8859-1
呼叫者已将Accept标头设置为 application / xml
不确定是什么在标题中添加了charset = ISO-8859-1。
要从内容类型标题中删除字符集,
以上所有内容均无影响。
来电者
curl -v -X POST \
https://<URL> \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'accept: application/xml'
Java资源
@RequestMapping(value = "<URL>",
method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public String processRequest(HttpServletRequest request) {
try {
Object response = service(request);
if (response != null) {
return response.toString();
}
} catch (Exception e) {
logger.error(e);
}
return createErrorResponse(ERR_CODE).toString();
}
// response header
200 OK
Time:1247 ms
Size:1.62 KB
Save
Download
Date →Wed, 17 Jul 2019 07:30:28 GMT
Server →Apache
Strict-Transport-Security →max-age=31536000; includeSubDomains
Content-Type →application/xml;charset=ISO-8859-1
Content-Length →1374
Via →1.1 <URL>
Keep-Alive →timeout=5, max=10000
Connection →Keep-Alive
这很好。开始看到以下行为,升级以下库之后
jackson 2.6.0 to 2.6.3
httpclient 4.5 to 4.5.3
httpcomponents 4.4.1 to 4.4.6
springframework 4.2.9 to 4.3.17
需要知道一种方法,该方法如何从标头中省略字符集,以及首先添加它的原因。
答案 0 :(得分:0)
找到了问题。
@ResponseBody
注释将字符串输出转换为HTTP支持的格式。
在内部,如果未指定,它将charset=ISO-8859-1
附加到内容类型标题中。
由于我要删除此内容,因此更改后的方法从String
返回到ResponseEntity<String>
ResponseEntity将负责将输出转换为HTTP支持的格式,而不是注释。因此,现在可以使用代码控制转换为HTTP,而不是让spring做。在这里,我们可以显式设置所需的标题。
新代码如下:
@RequestMapping(value = "<URL>",method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<String> processRequest(HttpServletRequest request) {
try {
Object response = service(request);
if (response != null) {
prepareResponseEntity(response.toString());
}
} catch (Exception e) {
logger.error(e);
}
return prepareResponseEntity(createErrorResponse(ERR_CODE).toString());
}
private static ResponseEntity<String> prepareResponseEntity (String responseBody){
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add(HeartBeatServerConstants.HEADER_CONTENT_TYPE,MediaType.APPLICATION_XML_VALUE);
return new ResponseEntity<String>(responseBody,responseHeaders,HttpStatus.OK);
}
更新:spring-web的AbstractHttpMessageConverter在spring 4.2.9和4.3.17之间进行了更改,以添加不存在的字符集。Spring Doc