可以在查询和正文中混合使用Swagger的参数吗?

时间:2019-10-11 16:49:11

标签: python swagger swagger-2.0 connexion

尝试时出现错误,但是我想创建一个接受2个查询参数和1个正文项(名称列表)的终结点。当我连接运行但说这是无效的规范时。

/devices/list:
  post:
    tags: [Devices]
    operationId: app.get_devices
    summary: Gets a complete list of devices.
    parameters:
      - $ref: '#/parameters/foo-t'
      - $ref: '#/parameters/bar-t'
      - in: body
        name: device_names
        required: true
        type: array
        items:
          type: string
        description: a list of devices
...

它编译并运行时没有-in:正文部分。所以我知道2个参数都很好。似乎我在向python发送json数组时遇到问题。

明确返回的错误是:

  

connexion.exceptions.InvalidSpecification:{'in':'body','name':   'device_names','required':True,'type':'array','items':{'type':   'string'},'description':'设备名称列表'}在下面无效   任何给定的模式

     

无法验证中的“ oneOf”   schema ['properties'] ['paths'] ['patternProperties'] ['^ /'] ['properties'] ['post'] ['properties'] ['parameters'] ['items']:       {'oneOf':[{'$ ref':'#/ definitions / parameter'},                  {'$ ref':'#/ definitions / jsonReference'}]}

     

在instance ['paths'] ['/ devices / list'] ['post'] ['parameters'] [2]:       {'description':“设备名称列表”,        'in':'body',        'items':{'type':'string'},        '名称':'设备名称',        “必填”:是的,        'type':'array'}

我想要的结束状态是我可以说:

//In javascript
$.post("devices/list", {device_names: ["a","b","c"]}, {params:{foo:1, bar:42}}).success( x => {
  //...
});

# In Python3
def get_devices(foo, bar, device_names):
  pass

1 个答案:

答案 0 :(得分:1)

是的,您可以混合查询和正文参数。

该错误是由body参数语法错误引起的。对其进行更改,以使typeitems包裹在schema中,如下所示:

      - in: body
        name: device_names
        required: true
        schema:   # <-------
          type: array
          items:
            type: string
        description: a list of devices

在OpenAPI 2.0中,非主体参数(路径,查询,标头,表单参数)直接使用type关键字,但是主体参数必须将其类型包装在schema中。


上面的示例匹配包含-["a", "b", "c"]的字符串数组的请求正文。

如果应该将数组包装到JSON对象中

{
   "device_names": ["a", "b", "c"]
}

您需要按以下方式更改body参数:

      - in: body
        name: device_names
        required: true
        schema:
          type: object
          required: [device_names]
          properties:
            device_names:
              type: array
              items:
                type: string
        description: a list of devices