有关Spring MVC如何在这两种情况下重新使用Accept Header的一些信息

时间:2013-01-17 11:51:18

标签: java json spring spring-mvc

我正在研究可从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响应正文中重现的媒体类型?

1 个答案:

答案 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"})

请理解我在内存中键入了上述内容,因此您可能需要稍微调整一下。