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

Posted

技术标签:

【中文标题】如何重用 swagger 2.0 字符串模式定义?【英文标题】:How to reuse swagger 2.0 string pattern definition? 【发布时间】:2019-01-21 23:37:26 【问题描述】:

我在 swagger 2.0“定义”部分定义了以下内容。我首先定义了用于不同目的的许多对象属性中的时间戳格式,例如创建的时间戳和最后更新的时间戳。

definitions:
  TimeStamp:
    title: Timestamp format
    description: ISO 8681, "2016-08-18T17:33:00Z"
    type: string
    pattern: \d4-\d2-\d2T\d2:\d2:\d2Z
  Application:
    title: An application
    type: object
    properties:
      cDtm:
        title: Creation timestamp
        description: Some description
        type: string
        pattern:\d4-\d2-\d2T\d2:\d2:\d2Z

但是,在定义“应用程序”对象的“cDtm”属性时,我找不到重用时间戳定义的方法。如果我将 "$ref" 与 "title" 和 "description" 一起使用,我会收到警告“不允许在 '$ref' 旁边使用兄弟值”。如果我不使用“$ref”,我需要重复上面的类型和模式定义。

那么,我的问题是,有没有办法使用 $ref 来重用字符串模式定义,但仍然能够给定义的属性一个新的标题和描述?

谢谢!

必应

【问题讨论】:

您是说 ISO 8601 吗? 它是 ISO 8601,但问题更笼统,关于如何使用新的标题和描述重用字符串模式定义 【参考方案1】:

OpenAPI 规范包括此格式的内置 format: date-time,因此您实际上不需要在此处使用 pattern。相反,使用:

type: string
format: date-time

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

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

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

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

pattern: ^\d4-\d2-\d2T\d2:\d2:\d2Z$

【讨论】:

感谢您指出“allOf”解决方案和 ^..$ 表达式。是的,这就是我要找的。​​span>

以上是关于如何重用 swagger 2.0 字符串模式定义?的主要内容,如果未能解决你的问题,请参考以下文章

如何注释 OpenAPI (Swagger) 2.0 中已弃用的字段?

如何使用 Swashbuckle.AspNetCore 在 Swagger 模式中将自定义泛型类型公开为字符串

swagger 2.0 中 JSON 对象的模式类型是啥

Swagger 2.0 - 如何使“一个或另一个”参数成为必需?

Swagger/OpenAPI - 使用 $ref 传递可重用的定义参数

我可以在 swagger 2.0 中定义嵌套数组对象吗