当前位置: 首页 > 知识库问答 >
问题:

如何在OpenAPI(Swagger)中为同一路径定义不同的身体参数?

韦宏扬
2023-03-14

我有一个服务,它可以基于Content-Type头有两种不同的主体参数。

例如。对于路径/Pet

>

  • 如果使用 Content-Type: application/somecustom.resource json,则 POST 可以将 Pet 作为正文参数。

    如果使用了Content-Type: Application/somecustom.functionjson,那么POST应该使用一些不同的主体参数来调用函数并返回不同的响应。

    关于如何在OpenAPI(Swagger)中体现这一点,有什么建议吗?

  • 共有2个答案

    穆嘉
    2023-03-14

    不,不可能在同一路径项中为同一操作定义两个不同的主体参数。路径项名称是唯一的,因为它是属性名称(因此也是JSON键值映射中的“键”),Swager规范允许在给定操作中最多有一个主体参数。

    有几种替代方法可以满足这一需求:

    创建两个单独的路径项

    例如:

    /pets/createFromDescription:
      post:
        summary: Create a pet from a basic description
        operationId: createPetFromDescription
        parameters:
          - name: petDescription
            in: body
            required: true
            schema:
              $ref: "#/definitions/PetDescriptionObject"
        responses:
          200:
            description: OK
    /pets/createFromCatalog:
      post:
        summary: Create a pet from a standard catalog entry
        operationId: createPetFromCatalogEntry
        parameters:
          - name: petCatalogEntry
            in: body
            required: true
            schema:
              $ref: "#/definitions/PetCatalogEntry"
        responses:
          200:
            description: OK
    

    使用鉴别器创建子类型

    在Swagger–open API 2.0规范中有所描述。

    例:

    /pets:
      post:
        summary: Create a pet 
        operationId: createPet
        parameters:
          - name: petSource
            in: body
            description: Structured pet information, from which to create the object 
            required: true
            schema:
              $ref: "#/definitions/CreatePet_Request"
        responses:
          200:
            description: OK
    
    definitions:
      CreatePet_Request:
        type: object
        properties:
          requestVariant:
            type: string
        required:
        - requestVariant
        discriminator: requestVariant
    
      PetDescriptionObject:
        allOf:
        - $ref: "#/definitions/CreatePet_Request"
        - type: object
          properties: 
            name: 
              type: string
            description:
              type: string
    
      PetCatalogEntry:
        allOf:
        - $ref: "#/definitions/CreatePet_Request"
        - type: object
          properties: 
            SKU: 
              type: string
            Breed:
              type: string
            Comments:
              type: string
    

    这些方法都不是请求的媒体类型。虽然请求可能接受多种媒体类型,但如果使用特定媒体类型意味着对请求正文的某些要求,则必须在操作或正文参数的描述属性中记录该要求。

    程瑞
    2023-03-14

    OpenAPI 3.0 支持每种媒体类型的不同架构

    openapi: 3.0.0
    ...
    paths:
      /pet:
        post:
          requestBody:
            required: true
            content:
              application/somecustom.resource+json:
                schema:
                  $ref: '#/components/schemas/Pet'
              application/somecustom.function+json:
                schema:
                  $ref: '#/components/schemas/Foo'
    
     类似资料:
    • 我想为我的Swagger API创建一个递归规范。这个概念似乎没有出现在Swagger文档中,所以我怀疑这是不可能的。因此,我也愿意接受任何由Swagger支持的替代解决方案。 例如,我试图创建一个类似文档的结构。每个文档都有部分,每个部分都有文本和自己的部分。我计划使用这样的APIendpoint: http://a.b.com/docs/{文档ID} http://a.b.com/docs/{

    • 如何为这些参数编写OpenAPI(Swagger)定义?

    • 给定以下带有springfox-swagger2注释的REST方法: null 我是不是漏掉了什么?有没有办法告诉swagger为每个HTTP/OK状态代码呈现两个不同的模型?

    • 我已经开始为CDC测试实施PACT。我如何处理我们在不同环境的路径中传递不同参数的场景? 例如,我的测试调用一个函数,该函数通过命中endpoint并传递一些参数来请求服务中的一些数据。非常标准。 E、 G: 对于不同的环境(QA、UAT等),必须传递特定于该环境的唯一数据,以获得有效的200响应。因此,在我的示例中,每个env的carId和userId需要不同。当我最初设置测试时,我使用了我们的

    • 我试图用一个静态的swagger文件来记录一个API,该文件可以返回一些JSON,其中包含一个类似如下的数组: 我尝试了几种不同的方法来定义规范,使用多态性或显式定义多个示例。这些例子要么最终看起来像: 或者只是: 有没有办法在我的swagger规范中定义一个示例,以便swagger-ui显示的示例有效负载将包含一个数组,该数组包含一个A类型的示例和一个B类型的示例,就像我编写的第一个JSON一样