我正在研究可从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>
第一个链接会向网址生成HTTP请求: messageconverters / json
第二个链接会向网址生成HTTP请求: /messageconverters/json.json (与第一个网址不同,此以.json结尾扩展
好的,这两个链接都有 class =&#34; writeJsonLink&#34; ,并且与这些链接的click事件相关,调用了以下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响应将其内容传递给将在视图中显示输出的处理程序... ok ...
在发送请求之前,该功能会检查网址是否以.json扩展名结尾
如果此请求不以.json扩展名结尾,则会在我的HTTP请求中添加以下标头:
接受= application / 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);
//返回新的JavaBean(&#34; bar&#34;,&#34; apple&#34;); }
现在,我的问题是与两个链接的区别。
第一个不以.json 扩展名结尾,因此添加了Accept标头,并在application / json 上设置了浏览器预期接收JSON对象
第二个以.json 扩展名结束,因此 Jquery方法不设置Accept Header
但是,这个东西是什么意思?当URL以.json结尾时,自动设置Accept标头?或者更一般地说,当我有一个以某种类型扩展名结尾的URL(例如像.xml)时,会自动设置相对的Accept标头吗?或者仅仅在第二种情况下,不要设置Accept Header意味着不处理我可以在HTTP响应正文中重现的媒体类型?
答案 0 :(得分:1)
好的,你的英语不是那么热,所以让我尽力帮助你。
根据我的理解,这可能是错误的,你想知道当URL以json结尾时,浏览器是否将Accept:标头设置为json?我不相信这种情况。我可能在这方面有很大的错误,但你可以通过使用Firebug或Chrome的开发者工具来测试这个,或者如果你喜欢IE得到Fiddler,并且确切地看到从浏览器发送的标题。
现在,如果你问Spring是否会神奇地把标题放在那里,那么我认为答案是“不”。请求中的HTTP标头来自浏览器,虽然您可以放入Servlet过滤器或设置请求过滤器的东西,但我认为假设所有浏览器处理这些请求标头是危险的同样的方式。
不,如果问题是“我的请求如何进入我的Controller的writeJson()方法?”,那么答案与“Accept”标题完全没有关系。您的方法匹配任何以/ json结尾的URI模式,在这两种情况下,您的URL都以/ json结尾。如果你想过滤那些有JSON“Accept”标题的东西,那么我想你想做这样的事情:
@RequestMapping(value="/someUriPattern", headers = {"Accept=application/json"})
请理解我在内存中键入了上述内容,因此您可能需要稍微调整一下。