将整数列表传递给GET REST API

vir*_*sha 6 rest web-services spring-mvc http-headers

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

但是我读了HTTP文档,它说无论何时你需要从数据库中检索数据都更喜欢GET调用.那么,是否有任何我可以从角度JS替换POST调用GET调用并传递整数列表.但是,GET HTTP有许多缺点,例如:URL的长度是有限的.考虑到我们必须从数据库中获取1000个实体的情况.

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

例如:考虑书表中有100本书,但我只想要几本书,比如id:5,65,42,10,53,87,34,23.这就是我在POST调用中在整数列表中传递此Id列表的原因.

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

Pia*_*nov 9

我更喜欢通过HTTP路径变量的变量来解决您的问题,因为在REST意识形态中,在资源名称" http://../resource/id "和HTTP参数用于过滤之后传递资源ID .

通过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();
}
Run Code Online (Sandbox Code Playgroud)

您可以使用下一个变种拨打电话:

  1. HTTP://服务器:端口/ CTX /书籍IDS = 5,65,42
  2. HTTP://服务器:端口/ CTX /书籍IDS = 5&IDS = 65&IDS = 42

另请参阅此讨论:https://stackoverflow.com/a/9547490/1881761


通过HTTP路径变量

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

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

你的电话将是这样的:http:// server:port/ctx/books/5,65,42



vir*_*sha 5

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();
}    
Run Code Online (Sandbox Code Playgroud)

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

然后它会抛出异常:返回 414 (Request-URI Too Long)

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

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

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

因此,结论是,当运行时可能存在可变 URI 长度时,请坚持使用 POST 调用,以免出现此类异常[返回 414(请求 URI 太长)]