处理用户在API响应中输入所有可选参数之一的情况

时间:2019-03-18 23:54:00

标签: rest

我编写的API端点支持两个参数之一,并且要求用户仅为其提供一个值,但理想情况下,它们不应同时指定两者。

{"A": "something", "B": "something"}

当用户不提供两者中的任何一个时,将引发异常。

但是,我想知道当用户为两者输入值时我该如何处理方案。

在上下文中,从广义上讲,A是B的子集。与我的队友有两种意见:

  1. 当用户同时输入两者时,以A为准。
  2. 当用户同时输入两者时,会抛出400异常以提醒用户我们只需要这两个之一。

谢谢!

2 个答案:

答案 0 :(得分:0)

  

但是,我想知道当用户为两者输入值时我该如何处理方案。

您可以将媒体类型视为类似物。

也就是说,假设我们有一个针对application/vnd.example.AorB+json的规范,它定义了A字段,B字段,并明确表示应该存在这两个选项之一。

现在,当端点获取内容类型为application/vnd.example.AorB+json的POST或PUT时,我们知道请求正文中包含的实体应该是对键和值具有附加约束的json文档。

因此,以此类推,如果键和值错误,则端点应以与JSON结构本身格式不正确的方式相同的方式拒绝文档。

如果您购买了该逻辑,那么实际的答案是部署一个期望json的终结点,将其发送给破碎的对象,然后看看您得到了什么响应。然后在此上为您自己的设计建模。

WebDAV标准对其422 status code的定义进行了有趣的讨论。

  

422(不可处理实体)状态代码表示服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态代码不合适),并且请求实体的语法正确(因此为400 (错误请求)状态代码不合适),但无法处理其中包含的说明。

因此,您可以查看自己的情况,并尝试确定是否同时包括这两个元素“在语法上都是正确的”,然后选择匹配的状态代码。

在实践中,这实际上并不重要。您应该在解释具体问题in the body of the response,以便人类可以弄清楚发生了什么。不同的状态代码实际上是元数据,因此通用组件可以弄清楚该怎么做-但是标准中没有任何内容可以告诉通用组件处理422400

所以不要想太多。

答案 1 :(得分:0)

如果期望拥有一项财产是合理/有意义的,则应只允许一项财产。

严格的API很有帮助,因为它们可以更好地引导用户了解服务器和资源的意图。

一种用于此类工作的好工具是使用json-schema之类的东西来确切指定您的服务器可以做什么和不希望做什么。能够指定只能显示2个属性中的1个是其功能之一。