我正在研究可从 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 格式
@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 标头会自动设置吗?或者更一般地说,当我有一个以某种扩展名(例如 .xml)结尾的 URL 时,是否会自动设置相关的 Accept 标头?
或者只是在第二种情况下,不要设置 Accept Header 意味着不处理我可以在 HTTP 响应正文中接收的媒体类型?