【问题标题】:Correct response on a request for multiple objects where one does not exist对不存在的多个对象的请求的正确响应
【发布时间】:2013-12-31 02:01:11
【问题描述】:

对于一个或多个不存在的多个对象的 GET 请求的正确响应是什么?例如:

http://domain.net/event-list/?ids=1&ids=5&ids=3

其中 id 为 5 的对象不存在。我应该返回一个仅包含对象 1 和 3 的列表,还是应该返回某种错误?正确的答案是什么?

我还想知道如果请求是 POST,行为是否应该有所不同。例如:

$.post('domain.net/events/bulk-edit/?ids=1&ids=5&ids=3', { public: true });

我应该只对存在的对象执行操作还是根本不执行操作并返回错误?

我知道如果非空查询字符串可以用于 POST 请求,会有一些争论。我认为它们仅适用于您请求对象子集对它们执行某些操作的特殊情况。

【问题讨论】:

  • 知道响应是哪种类型会很有趣。是 HTML、JSON、XML 还是完全不同的东西?
  • 三个都是。我有基于查询字符串参数(后端表单)过滤对象的统一逻辑。这个逻辑可以说参数无效,在这种情况下我应该返回某种错误,或者它可以是有效的,在这种情况下我返回请求的对象。所以问题是如果ids=1&ids=5&ids=3 是无效的,如果其中一个对象不存在或者它是否应该被认为是有效的,在这种情况下我应该只返回两个现有的对象而不通知用户或远程系统他请求了一个无效的身份证。

标签: api http web


【解决方案1】:

好的,我考虑了一下,我认为这是正确的做法。

这有点让人头疼,因为您一次请求多个对象,这通常是 WebDAV 的事情,带来诸如 207/Multistatus 响应之类的奇迹。首先让我说我认为您的查询字符串格式错误。我认为它真的应该是这样的:

?ids[]=1&ids[]=5&ids[]=3

现在关于对GET 请求的响应。我相信以下响应代码是正确的:

  • 200 如果 任何 对象可以通过 id 找到
  • ids 查询参数缺失或为空时为400(除非您认为ids 不应该转换为获取所有对象
  • 404 如果 none 的给定 id 匹配任何对象

如果您想通知客户端无法部分满足请求,您可以随意发送Warning 标头(参见RFC 2616, sec 14.46)。但是,如果您真的想做到绝对正确™,以下是处理并非每个 id 都有效的请求的方法:

  • 如果所有个ID都可以用来加载一个对象,发送200/Ok响应码
  • 如果有 任何 个 ID 无法用于加载对象,请通过 301/Moved Permanently 重定向到没有违规 ids 参数的新 URL

至于POST 请求:据我了解,您想一次性将多个事件设为公开?如果是这样,我真的会改变顺序:将POST 发送到http://domain.net/events/publish 并在帖子正文中发送ID。

【讨论】:

  • 谢谢。顺便说一句,它不需要看起来像这样:?ids[]=1&ids[]=5&ids[]=3。这仅适用于某些框架。例如。 Django 框架不使用方括号语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多