繁体   English   中英

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

[英]Some information about how Spring MVC recive and use the Accept Header in these two case

我正在研究可从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”,并且与这些链接的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响应将其内容传递给处理程序,该处理程序将在视图中显示输出...确定...

在发送请求之前,该函数检查URL是否不以.json扩展名结尾

如果此请求不以.json扩展名结尾,则会将以下标头添加到我的HTTP请求中:

接受= application / 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);

//返回新的JavaBean(“ bar”,“ apple”); }

现在,我的问题是关于两个链接的区别。

第一个不以.json扩展名结尾 ,因此添加了Accept标头,并将其设置在application / jsonsayng上,以使浏览器期望接收JSON对象

第二个以.json扩展名结尾 ,因此Jquery方法没有设置Accept Header

但是,这是什么意思? URL以.json结尾时,是否会自动设置Accept标头? 或更笼统地说,当我有一个以某种扩展名(例如.xml)结尾的URL时,会自动设置相对的Accept标头?

还是仅在第二种情况下,不要设置“接受标头”就意味着不处理我可以在HTTP响应正文中获取的媒体类型?

好的,您的英语不太好,所以让我尽力帮助您。

以我的理解,这很可能是错误的,您是否想知道当URL以json结尾时浏览器是否将Accept:标头设置为json? 我认为情况并非如此。 我可能会对此大错特错,但是您可以使用Firebug或Chrome的Developer Tools等工具进行测试,或者如果您喜欢IE获取Fiddler,则可以查看从浏览器发送的标头的确切信息。

现在,如果您要问Spring是否会神奇地将标题放置在此处,那么我再次认为答案是“否”。 请求上的HTTP标头来自浏览器,尽管您可以放入Servlet过滤器或用于设置请求过滤器的东西,但我认为如果假设所有浏览器都以相同的方式处理这些请求标头,那将很危险。

不,如果问题是“我的请求如何全部到达Controller的writeJson()方法?”,那么答案根本与“ Accept”标头无关。 您的方法与以/ json结尾的任何URI模式匹配,在两种情况下,您的URL以/ json结尾。 如果您想过滤具有JSON的“ Accept”标头的内容,那么我认为您想执行以下操作:

@RequestMapping(value="/someUriPattern", headers = {"Accept=application/json"})

请理解,我是从内存中键入以上内容的,因此您可能需要稍作调整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM