我一直在寻找为HTTP POST请求指定正文类型的最佳方法,该请求有两个互斥的字段。 我使用swagger作为API规范,我有一个请求必须有field_A或field_B,但不能同时使用。
现在我将两个字段都设置为可选字段,描述规范中的行为(何时设置一个字段或另一个字段),并验证服务器上的输入。如果没有填写任何字段,我将返回400-Bad-request。
我的问题是这是否是正确的方法(如果我指定一个额外的内容类型会更加RESTful吗?),或者如果Swagger中有什么东西允许我使这种行为更明显。
答案 0 :(得分:0)
我遇到了一个解决了我的问题的API。 对于给定字段,该字段的类型是可扩展的(如基类和多个扩展类)。为了区分不同的子类型,有一个鉴别器字段。
例如(Swagger格式的YAML),类型Foo是可扩展的,并且具有子类型FooA和FooB。鉴别器是一个类型字段:
definitions:
Foo:
type: object
properties:
type: string
x-extensible-enum:
- FOO_A
- FOO_B
discriminator: type
required:
- type
FOO_A:
allOf:
- $ref: '#/definitions/Foo'
- type: object
properties:
field_a:
type: string
required:
- field_a
FOO_B:
allOf:
- $ref: '#/definitions/Foo'
- type: object
properties:
field_b:
type: integer
format: int32
required:
- field_b
这使得反序列化变得更加复杂,但它是一种非常有趣的方法并且非常灵活。