对于具有一些无效ID的多个请求资源,GET的响应应该是什么?

时间:2016-05-18 15:51:26

标签: rest http spring-mvc get api-design

对请求的响应应该是什么 http://localhost:8080/users/1,2,3当系统没有ID为3的用户时<?p>

当所有用户都在场时,我返回一个200响应代码,其中包含响应正文中的所有用户对象。当用户请求一个缺少的用户时,我返回404并在正文中显示错误消息。

但是,有效ID和缺失ID之间混合的正文和状态代码应该是什么?

3 个答案:

答案 0 :(得分:1)

我假设您要遵循REST API原则。为了保持清晰的api设计,你应该使用查询字符串进行过滤

http://localhost:8080/users?id=1,2,3

然后你不会有这样的困境 - 你只能返回id包含在提供的值列表和200状态代码中的用户(即使列表为空)。一般来说这个端点

http://localhost:8080/users/{id}

应保留用于通过提供主键来请求单个资源(用户)。

答案 1 :(得分:0)

您要求的是集合。请求基本上是:&#34;给我ID为{1,2,3}的所有用户。&#34;这些用户的一个子集(让我们说没有用户但ID为3)仍然是一个成功的操作,这需要200 (OK)

如果您对此过于担心,仍然可以通过303 (See Other)将客户端重定向到没有违规元素的资源表示。

如果所有ID都无效,事情会变得有点棘手。人们可能只想简单地返回404 (Not Found),但严格来说这是不正确的:

  

404状态代码表示源服务器未找到目标资源的当前表示

确实,有一个:空集。从程序的角度来看,返回它可能确实更容易,而不是抛出错误。这依赖于客户能够处理空集/文档。

RFC允许您自由选择:

  

[...]原始服务器没有找到目标资源的当前表示,或不愿意透露存在

因此,如果您希望隐藏空集的存在,那就没关系。值得一提的是,一个包含任何东西的集合本身并不是什么;)

答案 2 :(得分:0)

我建议不要首先提供该方法,而是强迫API的用户发出三个单独的请求并返回明确的响应(用户1和2的两个200和{{1}用户3)。此外,API可以提供一个get方法,响应所有可用的用户ID等(取决于您的系统)。

或者,如果这不是一个选项,我想,你有两个选择:

  1. 一旦找不到一个用户,就立即返回404,在我看来技术上更准确。我的意思是,请求是 1,2和3 ,但未找到。
  2. 向用户1和2返回404,并返回null,这可能对您的方案最有用。