【问题标题】:Some information about how Spring MVC recive and use the Accept Header in these two case关于 Spring MVC 在这两种情况下如何接收和使用 Accept Header 的一些信息
【发布时间】:2013-01-17 11:51:18
【问题描述】:

我正在研究可从 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 格式的 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);

// return new JavaBean("bar", "apple"); }

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

第一个不要以.json结尾扩展名,所以Accept头被添加并设置在application/json上说浏览器期望接收JSON 对象

第二个以.json结尾扩展,所以Jquery方法不设置Accept Header

可是,这东西是什么意思?当 URL 以 .json 结尾时,Accept 标头会自动设置吗?或者更一般地说,当我的 URL 以某种扩展名(例如 .xml)结尾时,会自动设置相对的 Accept 标头?

或者只是在第二种情况下,不设置 Accept Header 意味着不处理我可以在 HTTP 响应正文中接收的媒体类型?

【问题讨论】:

    标签: java json spring spring-mvc


    【解决方案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"})
    

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

    【讨论】:

    • 好的,非常感谢所以,你是不是对我说,如果我想让我的控制器方法只管理来自我的视图的 JSON 对象,我必须放置元素“Accept=application/json”在我的 RequestMapping 注释中?
    • 我的意思是,如果您想将对该方法的调用限制为仅请求 JSON 的内容,添加正确的标头可能是个好主意(再次,我输入了记忆...请谷歌验证我没有错字)。
    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 2019-06-07
    • 2013-01-19
    • 1970-01-01
    • 2022-01-23
    • 2015-11-30
    • 2017-05-16
    • 2012-10-06
    相关资源
    最近更新 更多