1

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

4

1 回答 1

1

好吧,你的英语不是那么火爆,所以让我尽力帮助你。

在我的理解中,这很可能是错误的,您是否想知道当 URL 以 json 结尾时,浏览器是否会将 Accept: 标头设置为 json?我不相信是这样的。我可能对此大错特错,但您可以使用 Firebug 或 Chrome 的开发者工具之类的东西来测试它,或者如果您喜欢 IE 获取 Fiddler,并查看从浏览器发送的确切标头。

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

不,如果问题是“我的请求是如何到达我的 Controller 的 writeJson() 方法的?”,那么答案与“Accept”标头完全无关。您的方法匹配任何以 /json 结尾的 URI 模式,并且在这两种情况下,您的 URL 都以 /json 结尾。如果您想过滤具有 JSON 的“接受”标头的内容,那么我认为您想做这样的事情:

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

请理解我从记忆中输入了以上内容,因此您可能需要稍微调整一下。

于 2013-01-17T16:00:57.130 回答