【发布时间】:2012-11-04 04:41:57
【问题描述】:
给定以下 Spring 代码:
@Controller
@RequestMapping("/somepath")
public class SomeService {
@RequestMapping(headers = "Accept=application/json")
public ReturnType methodOne() {
// stuff
}
@RequestMapping(headers = "Accept=text/html")
public ReturnType methodTwo() {
// stuff
}
}
我注意到,当客户端根本不包含“Accept”标头时,总是优先调用“application/json”方法而不是 text/html 方法。我的问题是——为什么?它们之间没有什么可以选择的,那么为什么更喜欢其中一个呢?我本来希望看到一条错误消息...
一个具体的例子:
@RequestMapping("/somepath")
@Controller
public class SomeService {
@ResponseBody
@RequestMapping(headers = "Accept=application/json")
public ResponseEntity<String> methodOne() {
return new ResponseEntity<String>("Method One", HttpStatus.OK);
}
@ResponseBody
@RequestMapping(headers = "Accept=text/html")
public ResponseEntity<String> methodTwo() {
return new ResponseEntity<String>("Method Two", HttpStatus.OK);
}
@ResponseBody
@RequestMapping(headers = "Accept=application/xml")
public ResponseEntity<String> methodThree() {
return new ResponseEntity<String>("Method Three", HttpStatus.OK);
}
}
如果没有接受标头,则始终输出“方法一”。
【问题讨论】:
-
因为通常api旨在让数据在客户端服务器之间传输。 json 是一种数据格式,而 html 仅用于显示。
-
有趣的一点 - 我通过为 application/xml 接受标题添加另一个带有 RequestMapping 的方法来测试,因为应该没有理由选择 json 版本(反之亦然),但我仍然每次都得到 json 版本。
-
@AndyB 返回类型由请求类型决定。
-
但这就是我要说明的重点 - 如果我不设置接受标头,则 没有请求类型。
标签: json web-services spring-mvc