swagger 摆动中的默认对象参数

vc9ivgsu  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(141)

bounty将在5天后过期。回答此问题可获得+50声望奖励。ventsyv希望引起更多人关注此问题。

我不理解swagger中对象参数的默认值,文档中似乎没有任何示例。
例如:

components:
  parameters:
    coordinates:
      in: query
      name: coordinates
      description: Test Obj Parameter
      schema:
        type: object
        properties:
          lat:
            type: number
            default: 0.0
          long:
            type: number
            default: 0.0
      required: false

paths:
  /my/path/:
    get:
      parameters:
        - $ref: "./common.yaml#/components/parameters/coordinates"

1.我假设我可以在路径的参数部分定义default: [51.47, 0.0]
1.如果所有成员字段都是可选的,并且参数本身也是可选的,我是否需要在路径的参数中指定一个默认值?如果我不这样做,并且用户在没有提供值的情况下调用端点,后端会得到坐标0,0吗?
使用default: [51.47, 0.0]default: {"lat":51.4, "lon":0.0}生成的代码和未指定默认值的代码是相同的。
使其中一个成员字段为必填字段似乎只需要添加一个isSet标志、setteng和unsetter函数。

yvfmudvl

yvfmudvl1#

这里有几个不同的问题,所以我将把它们分成三个主题
1.在哪里可以找到一个带有定义默认值的参数的有效模式的示例?
1.我可以在路径的参数部分定义默认值吗?
1.如果参数和成员字段是可选的,是否需要声明默认值?

  • 免责声明:您没有提供任何生成器命令,因此我在大多数示例中使用了spring生成器的gradle-plugin。如果您无法使用我提供的代码,我可以更新此插件以使用不同的插件或生成器。*

示例在哪里?

swagger documentation for parameters有一个名为默认参数值的部分。
“在参数架构中使用default关键字指定可选参数的默认值。默认值是客户端未在请求中提供参数值时服务器使用的值。值类型必须与参数的数据类型相同。”
它还具有以下示例:

parameters:
        - in: query
          name: offset
          schema:
            type: integer
            minimum: 0
            default: 0
          required: false
          description: The number of items to skip before starting to collect the result set.
        - in: query
          name: limit
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
          required: false
          description: The number of items to return.

您在问题中提供的坐标模式是一个有效的模式。我甚至在自己的生成器中使用spring生成器测试了它,并且我能够创建一个有效的对象。该对象定义了以下字段:

@JsonProperty("lat")
private BigDecimal lat = new BigDecimal("0.0");

@JsonProperty("long")
private BigDecimal _long = new BigDecimal("0.0");

如您所见,默认值已按预期定义。

路径的参数部分可以定义默认值吗?

坦率地说,没有。swagger documentation声明:
$ref的任何兄弟元素都会被忽略。这是因为$ref的工作方式是用它所指向的定义替换它自己和它所在级别上的所有元素。
考虑以下模式:

components:
  schemas:
    EmployeeInfo:
      type: object
      properties:
        name:
          description: an employee's name
          $ref: '#/components/schemas/Name'
        address:
          $ref: '#/components/schemas/Address'
          description: an employee's address
    CustomerInfo:
      type: object
      properties:
        name:
          description: a customer's name
          $ref: '#/components/schemas/Name'
        address:
          $ref: '#/components/schemas/Address'
          description: a customer's address
    Name:
      description: a standard name
      type: object
      properties:
        firstName:
          type: string
        lastName:
          type: string
    Address:
      description: a standard address
      type: object
      properties:
        street:
          type: string
        city:
          type: string
        state:
          type: string
        zip:
          type: string

这个模式看起来是有效的,并且可以通过大多数验证工具。但是,如果我们查看swagger-ui中的employee info对象,我们会看到名称和地址的描述忽略了模式中的描述。x1c 0d1x
这是因为,正如文档所述,与$ref相同级别的任何其他内容都将被忽略。
这同样适用于您尝试在路径级别设置的任何默认值。如果您引用的是包含在其他位置的架构,则默认值将被忽略。

需要声明默认值吗?

这更像是一种风格的选择,福尔斯了古老的答案:“it depends”.记住swagger-ui部分是REST接口,但也是你的文档。你用这些坐标做什么?如果用户不提供它们会发生什么?预期会发生什么?提供或不提供它们会改变你的API响应模式吗?
最重要的是,您是否希望用户知道坐标的默认值?
例如,你可以很容易地在你的控制器中添加一个方法,如果请求中没有提供这些值,它会将这些值设置为某个值。你不必告诉你的用户这一点。这将是一个没有文档的默认值。如果你想告诉你的用户这一点,你可以设置一个示例和一个描述来解释默认值。
如果这个值是必需的,我个人倾向于让用户提供它。这可以确保他们知道他们请求的是什么,他们得到的是什么。如果这个值是可选的,这一切都归结为样式和文档。我更喜欢向我的用户解释用法,所以我会记录默认值,这样他们就知道它是如何使用的。这也会导致字段被自动设置。例如上面的Java代码。

更新显示使用示例而不是默认值

下面是一个在参数中使用示例的yaml。您可以将其复制并粘贴到swagger editor中,以查看它是如何呈现和显示的。当选择要查看的示例时,请注意描述发生了变化。还请注意,当您单击尝试时,它将使用示例创建一个请求(使用您在示例中提供的值:

openapi: 3.0.3
info:
  title: My-API
  version: 0.0.1
servers:
  - url: 'https://my.server.com'
paths:
  /employees:
    get:
      tags:
        - Employees
      summary: Add a new article to the store
      description: Get an Object
      operationId: getObject
      parameters:
        - $ref: '#/components/parameters/employeeInfo'
      responses:
        '200':
          description: Successful operation
components:
  parameters:
    employeeInfo:
      name: employee
      in: query
      description: The information of the employee
      required: false
      schema:
        $ref: '#/components/schemas/EmployeeInfo'
      examples:
        Employee Information:
          value:
            name: Bob Smith
            title: Front Desk
            responsibilities:
              - working
              - playing
            phone: (123) 555-1234
          description: |
            This is a description of the manager item.
            you can explain default values here.
            
            For example:
            
            **Parameters**:
            * **title**: 
              * defaults to Night Manager if not provided
              * Any String is valid, but may return status 404 if the title is not a valid title after validation
            * **name**:
              * no default value

        Manager Information:
          value:
            name: Kevin Mitchell
            title: Night Manager
            responsibilities:
              - watch Bob
              - don't sleep
          description: |
            This is a description of the manager item.
            you can explain default values here.
            
            For example:
            
            **Parameters**:
            * **title**: 
              * defaults to Night Manager if not provided
              * Any String is valid, but may return status 404 if the title is not a valid title after validation
            * **name**:
              * no default value
              * must be a valid employee name

  schemas:
    EmployeeInfo:
      description: general employee information
      type: object
      properties:
        name:
          type: string
        phone:
          type: string
          pattern: '^(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}$'
        id:
          type: string
          format: uuid
      oneOf:
        - $ref: '#/components/schemas/ManagementInfo'
        - $ref: '#/components/schemas/GruntInfo'
        
    GruntInfo:
      type: object
      properties:
        responsibilities:
          $ref: '#/components/schemas/EmployeeResponsibilities'
    ManagementInfo:
      type: object
      properties:
        name:
          type: string
          default: Bob
        title:
          type: string
          default: Manager
        responsibilities:
          $ref: '#/components/schemas/ManagerResponsibilities'
    ManagerResponsibilities:
      description: manager responsibilities
      type: array
      items:
        type: string
        enum:
          - Meetings
          - Sleeping
          - Planning
          - Rehersing
          - Supervising
      default:
        - meetings
        - sleeping
    EmployeeResponsibilities:
      title: Employee Responsibilities
      description: Employee responsibilities
      type: array
      items:
        type: string
        enum:
          - cleaning
          - organizing
          - attending
      default:
        - cleaning

现在可以看到下拉列表中提供了每个示例沿着值的描述。

如果您在employee示例上单击try it out,它将创建以下请求:https://my.server.com/employees?name=Bob%20Smith&title=Front%20Desk&responsibilities=working&responsibilities=playing&phone=%28123%29%20555-1234

相关问题