如何重用swagger 2.0字符串模式定义?

ubof19bj  于 2023-05-17  发布在  其他
关注(0)|答案(2)|浏览(180)

我在swagger2.0的“定义”部分定义了以下内容。我首先定义了时间戳的格式,我将在许多对象的属性中使用它来实现不同的目的,比如创建的时间戳和最后更新的时间戳。

definitions:
  TimeStamp:
    title: Timestamp format
    description: ISO 8681, "2016-08-18T17:33:00Z"
    type: string
    pattern: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z
  Application:
    title: An application
    type: object
    properties:
      cDtm:
        title: Creation timestamp
        description: Some description
        type: string
        pattern:\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z

但是,在定义“Application”对象的“cDtm”属性时,我无法找到重用时间戳定义的方法。如果我使用“$ref”沿着“title”、“description”,我会得到一个警告“不允许在'$ref'旁边使用兄弟值”。如果我不使用“$ref”,我需要重复上面的类型和模式定义。
所以,我的问题是,有没有一种方法可以使用$ref来重用字符串模式定义,但仍然能够为定义的属性提供新的标题和描述?
谢谢!
必应

5f0d552i

5f0d552i1#

OpenAPI规范包含了针对这种格式的内置format: date-time,所以实际上这里并不需要pattern。而应用途:

type: string
format: date-time

如果出于某种原因,您想坚持使用pattern,可以使用以下解决方法。基本上,如果将$ref Package 到allOf中,就可以向$ref“添加”属性。这在Swagger编辑器和Swagger UI中有效,但其他工具支持可能会有所不同。

Application:
    title: An application
    type: object
    properties:
      cDtm:
        title: Creation timestamp
        description: Some description

        allOf:
          - $ref: '#/definitions/TimeStamp'

还要记住,默认情况下,pattern作为部分匹配工作。要强制精确匹配,请将模式表达式包含在^..$中:

pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$
0qx6xfy6

0qx6xfy62#

openapi: 3.0.0
info:
  title: A dummy title
  version: 1.0.0
paths:
  /post:
    post:
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
                - msisdn
                - network
              properties:
                msisdn:
                  title: "msidn"
                  description: "msidn"
                  allOf:
                    - $ref: "#/components/schemas/msisdn-regex"
                msisdn1:
                  title: "msidn1"
                  description: "msidn1"
                  allOf:
                    - $ref: "#/components/schemas/msisdn-regex"  
                msisdn2:
                  title: "msidn2"
                  description: "msidn2"
                  allOf:
                    - $ref: "#/components/schemas/msisdn-regex"
                IMEI:
                  type: integer
                Network:
                  type: string
              example:   # Sample object
                msisdn: "10"
                IMEI: 20
                Network:
                - Vodafone
                - Jio
                - Airtel
        required: true        
            
      responses:
        '200':
          description: OK
servers:
  - url: http://httpbin.org
components:
  schemas:
    msisdn-regex:
      type: string
      pattern: ^[0-9]{10}$
      example: "1234567897"

相关问题