2016-03-08 72 views
2

我一直在寻找为具有两个互斥的字段的HTTP POST请求指定主体类型的最佳方式。 我正在使用swagger作为API规范,并且我有一个请求必须具有field_A或field_B,但不是两者都有。HTTP POST请求主体中的备用字段

现在我将这两个字段设置为可选,描述规范中的行为(何时设置一个字段或另一个字段)以及验证服务器上的输入。如果没有填充字段,我将返回一个400错误请求。

我的问题是这是否是正确的方法(如果我指定了额外的内容类型,它会更加RESTful吗?),或者Swagger中有什么东西可以让这种行为更明显。

回答

0

我遇到了解决我的问题的API。 对于给定的字段,该字段的类型是可扩展的(如基类和多个扩展类)。为了区分不同的子类型,有一个鉴别器字段。例如(YAGL在Swagger格式中),类型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 

这使得反序列化更加复杂,但这是一个非常有趣的方法,非常灵活。