-6ren">
gpt4 book ai didi

java - Spring MVC 展示中如何使用 JSON 处理 HTTP 请求?一些需要理解的问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:31 25 4
gpt4 key购买 nike

在此期间,我正在研究 Spring MVC 展示示例,可下载表单 STS 仪表板。

我对某些类型的映射(如展示的请求映射部分所示)有一些疑问。

在 home.jsp View 中我有两个链接:

<li>
<a id="byProducesAcceptJson" class="writeJsonLink"
href="<c:url value="/mapping/produces" />">
By produces via Accept=application/json</a>
</li>

<li>
<a id="byProducesJsonExt" class="writeJsonLink"
href="<c:url value="/mapping/produces.json" />">By produces via ".json"</a>
</li>

第一个链接生成一个针对 URL 的 HTTP 请求:“/mapping/products”第二个链接生成一个针对 URL 的 HTTP 请求:"/mapping/products.json"

writeJsonLink 类相关,我有以下简单的 Jquery 回调函数:

$("a.writeJsonLink").click(function() {

var link = $(this); // Variabile che si riferisce all'elemento del DOM che ha scatenato l'evento click (il link clickato)

// Esegue la chiamata ajax
$.ajax({
url: this.href, // Indirizzo verso cui è indirizzata la richiesta
beforeSend: function(req) { // Prima di inviare l'HTTP Request esegui la funzione passandogli il parametro req
if (!this.url.match(/\.json$/)) { // Se l'url termina con .json
req.setRequestHeader("Accept", "application/json"); // Aggiunge alla HTTP Request l'header Accept: application/json
}
},
success: function(json) {
MvcUtil.showSuccessResponse(JSON.stringify(json), link);
},
error: function(xhr) {
MvcUtil.showErrorResponse(xhr.responseText, link);
}});
return false;
});

这个功能的作用我很清楚:只需执行 AJAX 调用,然后在发送调用之前检查 URL 是否以 .json 结尾

好的,在我的 Controller 类中,我有以下方法来处理之前的 HTTP 请求:

@RequestMapping(value="/mapping/produces", method=RequestMethod.GET,
produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody JavaBean byProducesJson() {
System.out.println("Dentro byProducesJson()");
return new JavaBean();
}

这个方法的行为对我来说非常清楚:

此方法处理针对 URL“/mapping/products”的 HTTP GET 请求,并且 *products 元素指定该方法不会接受名为 Accept 的 header 与指定 MediaType 不兼容的请求,并且该方法会生成一个具有 JSON 格式的新对象,该对象将放入 HTTP 响应的正文字段*

新的JavaBean对象只包含两个初始化变量和getter\setter方法:

public class JavaBean {

private String foo = "bar";
private String fruit = "apple";

// Getter & Setter Method

好的...因此使用此变量值创建一个新的 JavaBean 对象,并将该值存储在 JSON 对象中,该对象放置在对浏览器的 HTTP 响应中。

单击这两个链接,在浏览器中会出现相同的输出,这个:{"foo":"bar","fruit":"apple"}

现在我对此有一些疑问:

  1. 第一个链接生成一个 HTTP 请求:/mapping/products

    第二个链接生成一个 HTTP 请求:/mapping/products.json

    我的方法处理针对格式为“/mapping/products”的 URL 的 HTTP 请求,为什么此方法还处理以 .json 结尾的第二种类型的 HTTP 请求?

  2. 第一个 HTTP 请求不以 .json 扩展名结尾,因此,当执行前面的 Jquery 代码时,我不会输入 if 正文,因此不会为我的 HTTP 请求设置以下 header :("Accept", "application/json")

    好的,我的方法的 @RequestMapping 注释包含 products=MediaType.APPLICATION_JSON_VALUE 元素。根据我阅读文档的理解,此方法必须处理 HTTP 请求仅当其 header 中存在包含“Accept”、“application/json”作为值的 Accept header

    这个HTTP请求不包含这个 header ,为什么它是由我的方法处理的?

  3. 与2种HTTP请求有什么区别?都以同样的方式处理?为什么?

非常感谢

安德里亚

最佳答案

我认为您正在看到 Spring 的内容协商的效果。 HTTP 本身只提供一种方法来指示响应所需的内容类型:Accept header 。 Spring 通过内容协商 bean 提供了两种附加方法。它可以将 URI 后缀(在本例中为 .json)解释为对特定内容类型的请求。 bean 在传递 Controller 类之前去掉后缀。

关于java - Spring MVC 展示中如何使用 JSON 处理 HTTP 请求?一些需要理解的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13827689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com