【发布时间】:2013-01-17 11:51:18
【问题描述】:
我正在研究可从 STS 仪表板下载的 Spring MVC 展示示例。
这次我正在研究这个例子的转换器部分,我有一些问题要问你。
首先,在我看来,我有以下两个链接:
<li>
<a id="writeJsonAccept" class="writeJsonLink" href="<c:url value="/messageconverters/json" />">Write JSON via Accept=application/json</a>
</li>
<li>
<a id="writeJsonExt" class="writeJsonLink" href="<c:url value="messageconverters/json" />">Write JSON via ".json"</a>
</li>
第一个链接向 URL 生成一个 HTTP 请求:messageconverters/json
第二个链接生成一个对 URL 的 HTTP 请求:/messageconverters/json.json(与第一个 URL 不同,这个以 .json 结尾 扩展名
好的,这两个链接都有class="writeJsonLink",并且与这些链接的点击事件相关,调用了以下JQuery回调函数:
$("a.writeJsonLink").click(function() {
var link = $(this);
$.ajax({
url: this.href,
beforeSend: function(req) {
if (!this.url.match(/\.json$/)) {
req.setRequestHeader("Accept", "application/json");
}
},
success: function(json) {
MvcUtil.showSuccessResponse(JSON.stringify(json), link);
},
error: function(xhr) {
MvcUtil.showErrorResponse(xhr.responseText, link);
}});
return false;
});
此函数仅执行 AJAX 调用并等待 HTTP 响应将其内容传递给将在视图中显示输出的处理程序...好的...
在发送请求之前,该函数会检查 URL 是否不以 .json 扩展名结尾
如果此请求不以 .json 扩展名结尾,则会将以下标头添加到我的 HTTP 请求中:
接受 = 应用程序/json
据我所知,Accept Header 说明哪种特定媒体类型对于 HTTP 响应是相当可接受的,在这种情况下说唯一可接受的媒体类型是具有 JSON 格式的 JavaScript 对象,好的...
此请求由我的控制器类的以下方法处理,该方法返回一个将使用 Jaxb2RootElementHttpMessageConverter 转换为 JSON 格式的 valorized 对象
@RequestMapping(value="/json", method=RequestMethod.GET)
public ResponseEntity<JavaBean> writeJson() {
// Oggetto che rappresenta gli HTTP Header dell'HTTP Response
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.TEXT_PLAIN);
return new ResponseEntity<JavaBean>(new JavaBean("bar", "apple"), headers , HttpStatus.OK);
// return new JavaBean("bar", "apple"); }
现在,我的问题是关于这两个链接的区别。
第一个不要以.json结尾扩展名,所以Accept头被添加并设置在application/json上说浏览器期望接收JSON 对象
第二个以.json结尾扩展,所以Jquery方法不设置Accept Header
可是,这东西是什么意思?当 URL 以 .json 结尾时,Accept 标头会自动设置吗?或者更一般地说,当我的 URL 以某种扩展名(例如 .xml)结尾时,会自动设置相对的 Accept 标头?
或者只是在第二种情况下,不设置 Accept Header 意味着不处理我可以在 HTTP 响应正文中接收的媒体类型?
【问题讨论】:
标签: java json spring spring-mvc