我有一个Spring请求映射,我想默认返回XML,如果在请求标头中指定,则返回JSON。下面是一些代码:
请求映射
@RequestMapping(value = "/batch/{progName}", method = RequestMethod.GET, produces = "application/xml)
public ResponseEntity<JobResults> processTestObject(@PathVariable("progName") String progName,
@RequestHeader("Content-Type") String contentType) throws Exception {
HttpHeaders responseHeaders = MccControllerUtils.createCacheDisabledHeaders();
if(contentType.equals("application/json")) {
responseHeaders.setContentType(MediaType.APPLICATION_JSON);
}
LOGGER.info("Running batch program " + progName);
JobResults response = batchService.processProgName(progName);
return new ResponseEntity<JobResults>(response, responseHeaders, HttpStatus.OK);
}
- 使用没有标头的邮递员,当我到达此端点时,我会收到一个
400 Bad Request
状态代码。 - 在邮递员标题字段中,如果我
Content-Type
指定为application/xml
我得到正确的 XML 响应。 - 如果我将
Content-Type
指定为application/json
则会收到错误 返回:Unexpected '<'
我想要什么:
默认情况下从终结点返回 XML,并返回 JSON(如果在请求中指定(
编辑
截至目前,当 Postman 中没有发送Accept
或Content-Type
时,请求返回400 Bad Request
。为了检索所需的响应,我必须指定要application/xml
的Accept
和Content-Type
@RequestMapping(value = "/batch/{progName}", method = RequestMethod.GET)
public ResponseEntity<JobResults> processTestObject(@PathVariable("progName") String progName,
@RequestHeader("Content-Type") MediaType contentType) throws Exception {
HttpHeaders responseHeaders = MccControllerUtils.createCacheDisabledHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_XML);
if(!contentType.toString().equals("*/*")) {
responseHeaders.setContentType(contentType);
}
LOGGER.info("Running batch program " + progName);
JobResults response = batchService.processProgName(progName);
return new ResponseEntity<JobResults>(response, responseHeaders, HttpStatus.OK);
}
您的示例仍然从应该Accept
的请求中获取Content-Type
。其次,确保 JobResults 对象可由 json 封送器和 xml 封送器序列化。第三,如果您希望请求 json 的特定行为,您应该检查该特定媒体类型,而不是像"*/*"
这样的通用媒体类型。
控制器:
@RequestMapping(value = "/batch/{progName}", method = RequestMethod.GET)
public ResponseEntity<JobResults> processTestObject(@PathVariable("progName") String progName,
@RequestHeader("Accept") MediaType accept) throws Exception {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_XML);
if(!accept.toString().equals("*/*")) {
responseHeaders.setContentType(accept);
}
JobResults response = new JobResults("23423", "result");
return new ResponseEntity<JobResults>(response, responseHeaders, HttpStatus.OK);
}
一些响应对象,但有注释。
@XmlRootElement
public class JobResults {
String id;
String name;
public JobResults(String id, String name) {
this.id = id;
this.name = name;
}
....
}
上面的代码在通过标头请求时为我提供了application/json
Accept
。