将整数列表传递给 GET REST API

Passing List of Integers to GET REST API

我想在前端从数据库中获取实体列表。 所以我在 Spring MVC 中编写了 POST REST HTTP 调用。

但我阅读了 HTTP 文档,其中指出每当您必须从数据库中检索数据时,首选 GET 调用。 那么,是否有任何我可以将 POST 调用替换为来自 angular JS 的 GET 调用并传递整数列表。 但是,GET HTTP 有很多缺点,例如:URL 的长度是 limited.Considering 我们必须从数据库中获取 1000 个实体的情况。

请建议我获取实体的可能方法或在 Spring MVC 中编写 GET REST API 以获得整数列表(指的是实体的 ID)。

例如:假设书table中有100本书,但我只想要几本书,比如id:5,65,42,10,53,87,34,23。 这就是为什么我在 POST 调用中将此 Id 列表传递到整数列表中的原因。

目前卡住了如何将其转换为 GET 调用。简而言之,如何通过 GET REST 调用传递整数列表。

如果您想从 API 中读取实体,则必须使用 GET 调用。

获得它们的更好方法是使用查询参数作为过滤器。

REST DESIGN 每次不能通过 id 检索多个实体。

一个例子:

GET /library/books/58731 -> returns 只有一本书被 58731

识别

GET /library/books?numPages>70returns所有70页以上的书

我认为如果你需要检索很多书,因为它们有一些匹配的逻辑,试着把它作为一个 queryString。

另一个例子:

GET /library/books?stored>20150101 returns 2015 年加入图书馆的所有书籍

如果您向我们提供更多关于该系列的信息和要求,我们会更直接地回答。

对于您的问题,我更喜欢通过 HTTP 路径变量的变体,因为在 REST ideology a resource ID is passed after a resource name 'http://../resource/id 中并且 HTTP 参数用于过滤。

通过 HTTP 参数

如果您需要通过 HTTP 参数传递您的 ID,请参见下面的示例:

这是您的 Spring MVC 控制器方法:

@RequestMapping(value = "/books", params = "ids", method = RequestMethod.GET)
@ResponseBody
Object getBooksById_params(@RequestParam List<Integer> ids) {
    return "ids=" + ids.toString();
}

您可以使用以下变体拨打电话:

  1. http://server:port/ctx/books?ids=5,65,42
  2. http://server:port/ctx/books?ids=5&ids=65&ids=42

也看看这个讨论:


通过 HTTP 路径变量

您也可以通过路径变量传递您的 ID,请参见下面的示例:

@RequestMapping(value = "/books/{ids}", method = RequestMethod.GET)
@ResponseBody
Object getBooksById_pathVariable(@PathVariable List<Integer> ids) {
    return "ids=" + ids.toString();
}

您的通话将如下所示:http://server:port/ctx/books/5,65,42


或者,为了允许复杂的查询,您需要为查询提供自己的剩余语言。所以要创建一个查询,你 POST 到 /library/query 然后你用 POST /library/query/12345 和数据 {id:34} 之类的东西编辑它然后你执行查询GET /library/books?query=12345

GET HTTP 调用的优点:它总是用于数据的检索。(从这个角度来看:我们应该为每个和每个检索实现)

通过HTTP参数

如果您需要通过 HTTP 参数传递您的 ID,请参见下面的示例:

这是您的 Spring MVC 控制器方法:

@RequestMapping(value = "/book", params = "ids", method = RequestMethod.GET)
@ResponseBody
Object getBooksById_params(@RequestParam List<Integer> ids) {
return "ids=" + ids.toString();
}    

它工作正常,但对于特殊情况:假设 URI 超过 2048 个字符。这意味着列表中有很多 ID(例如:1000)

然后它抛出一个异常: return414(请求 URI 太长)

http://www.checkupdown.com/status/E414.html

经过一些研究,我的理解是:HTTP 协议不会对 URI 的长度设置任何先验限制。服务器必须能够处理它们所服务的任何资源的 URI,并且如果它们提供可以生成此类 URI 的基于 GET 的形式,则应该能够处理无限长度的 URI。如果 URI 长于服务器可以处理的长度,服务器应该 return 414(Request_URI 太长)状态。

我也浏览过类似获取 GET URI 长度的网站:

所以结论是,在运行时可以有可变 URI 长度的情况下坚持 POST 调用,以免出现此类异常[return 414(请求 URI 太长)]

你可以这样调用列表:

***/users?id=1&id=2