为同一请求返回不同结构的最干净的方式
Cleanest way of returning different structures for the same request
我想实现一个接收对象的休息服务,并且 returns 如果该对象有资格使用某些参数进行处理。问题是 根据对象是否符合条件,响应的结构非常不同 。例如,在对象应该被处理的情况下,它与处理类型和优先级相关联。当它不符合条件时,返回原因。这是为同一请求返回不同结构的最简洁的方法。我可以想到三个选项,但可以随意添加其他选项。
选项A:
Return 数据作为包含结构化字段的信封
{
"eligible": bool,
"data": {
// Data depending on whether elbile or not
}
}
选项 B:
相应地使用不同的 HTTP 状态代码和结构 json。这在某种程度上是不干净的,因为它实际上不是请求中的错误,而是有效的响应。
选项C:
在符合条件或不符合条件的情况下,对发送的数据使用不同的字段,并让一个字段为空。
{
"eligible": bool,
"dataEligible": {
"processingType": "",
"priority": 0
}
"dataNonEligible": {
"reason": "",
}
}
我认为这对 422 Status Code 来说是一个很好的用例。它还不是官方 ISO,但很多公司(即 Twitter)正在使用它。
基本上这就是您遇到的情况 - 无法处理资源,尽管服务器理解请求并且语法正确。
选项C看起来也很合理,所以选择最符合您需要的选项。我不推荐 A,因为相同请求的不同格式对于使用静态类型语言(即 Java)
的消费者来说是个大问题
我想实现一个接收对象的休息服务,并且 returns 如果该对象有资格使用某些参数进行处理。问题是 根据对象是否符合条件,响应的结构非常不同 。例如,在对象应该被处理的情况下,它与处理类型和优先级相关联。当它不符合条件时,返回原因。这是为同一请求返回不同结构的最简洁的方法。我可以想到三个选项,但可以随意添加其他选项。
选项A:
Return 数据作为包含结构化字段的信封
{
"eligible": bool,
"data": {
// Data depending on whether elbile or not
}
}
选项 B:
相应地使用不同的 HTTP 状态代码和结构 json。这在某种程度上是不干净的,因为它实际上不是请求中的错误,而是有效的响应。
选项C:
在符合条件或不符合条件的情况下,对发送的数据使用不同的字段,并让一个字段为空。
{
"eligible": bool,
"dataEligible": {
"processingType": "",
"priority": 0
}
"dataNonEligible": {
"reason": "",
}
}
我认为这对 422 Status Code 来说是一个很好的用例。它还不是官方 ISO,但很多公司(即 Twitter)正在使用它。
基本上这就是您遇到的情况 - 无法处理资源,尽管服务器理解请求并且语法正确。
选项C看起来也很合理,所以选择最符合您需要的选项。我不推荐 A,因为相同请求的不同格式对于使用静态类型语言(即 Java)
的消费者来说是个大问题