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

用yaml对Swagger API描述进行“模板化”

卫甫
2023-03-14

是否可以使用带有swagger的模板。它是如何完成的。
我不想每次都重复三个属性time、len和off。

看看这篇文章的结尾,我在那里制作了一个“模板”来解释。

更多详情:

我有一个JSON响应结构,它总是返回一个具有相同属性的JSON,但是只有数据的内容会发生变化。

数据可以是数组,可以是字符串、数字、null或对象<这取决于Api的函数处理。

{
  time: "2019-02-01T12:12:324",
  off: 13,
  len: 14,
  data: [
    "Last item in the row of 14 items :-)"
  ]
}

请参阅本文末尾的Swagger定义示例。它是一个yaml,可以粘贴到swagger编辑器中https://editor.swagger.io/

在swagger documentation (yaml)中,我不想重复静态重复出现的项目,这些项目不会因任何其他请求而改变其功能。

如果问题不够准确,请让我知道。

swagger: "2.0"
info:
  description: ""
  version: 1.0.0
  title: "Templating?"
  contact:
    email: "someone@somewhere.com"

host: localhost
basePath: /api

paths:

  /items:
    get:
      summary: "list of items"
      produces:
        - application/json
      responses:
        200:
          description: "successful operation"
          schema:
            $ref: "#/definitions/Items"

  /item/{id}:
    get:
      summary: "specific item"
      produces:
        - application/json
      parameters: 
        - name: id
          in: path
          description: "ID of the demanded item"
          required: true
      responses:
        200:
          description: "successful operation"
          schema:
            $ref: "#/definitions/Item"

definitions:

  Items:
    type: object
    description: ""
    properties:
      time: 
        type: string
        format: date-time
        description: "date-time of the request"
      off:
        type: integer
        description: "index 0 based offset of list data"
        default: 0
      len:
        type: integer
        description: "overall amount of items returned"
        default: -1
      data:
        type: array
        items:
          $ref: "#/definitions/ListingItem"

  Item:
    type: object
    description: ""
    properties:
      time: 
        type: string
        format: date-time
        description: "date-time of the request"
      off:
        type: integer
        description: "index 0 based offset of list data"
        default: 0
      len:
        type: integer
        description: "overall amount of items returned"
        default: -1
      data:
        $ref: "#/definitions/InfoItem"

  ListingItem:
    type: integer
    description: "ID of the referenced item"

  InfoItem:
    type: object
    properties:
      id:
        type: string
      text:
        type: string

根据@Anthony的回答,我想这是我需要的结构。实际上它继承自“模板”:

...
templates:

  AbstractBasicResponse:
    properties:
      time: 
        type: string
        format: date-time
        description: "date-time of the request"
      off:
        type: integer
        description: "index 0 based offset of list data"
        default: 0
      len:
        type: integer
        description: "overall amount of items returned"
        default: -1

definitions:

  Items:
    type: object
    extends: AbstractBasicResponse
    properties:
      data:
        type: array
        items:
          $ref: "#/definitions/ListingItem"

  Item:
    type: object
    extends: AbstractBasicResponse
    properties:
      data:
        $ref: "#/definitions/InfoItem"

  ListingItem:
    type: integer
    description: "ID of the referenced item"

  InfoItem:
    type: object
    properties:
      id:
        type: string
      text:
        type: string
...

共有1个答案

郑嘉年
2023-03-14

您可能不必恢复到完全模板化,YAML中有两件事有助于“取消发布”重复数据:锚/别名和合并键。

锚的示例(由<code>介绍)

definitions:

  Items:
    type: object
    description: ""
    properties:
      time: 
        type: string
        format: date-time
        description: "date-time of the request"
      off: &index
        type: integer
        description: "index 0 based offset of list data"
        default: 0
      len: &amount
        type: integer
        description: "overall amount of items returned"
        default: -1
      data:
        type: array
        items:
          $ref: "#/definitions/ListingItem"

  Item:
    type: object
    description: ""
    properties:
      time: 
        type: string
        format: date-time
        description: "date-time of the request"
      off: *index
      len: *amount
  data:

YAML解析器需要能够处理这一点,但是由于加载后别名指向同一个对象,使用数据的代码可能不再工作,因为在某些情况下会产生副作用,这取决于加载数据的处理方式。< br >同一锚点可以有多个别名。

合并键(

  len: &altlen
    type: integer
    description: "overall amount of items returned"
    default: -1

然后

  len:
    <<: &altlen
    default: 42

然后做同样的事情:

  len:
    type: integer
    description: "overall amount of items returned"
    default: 42

合并键通常在加载时由YAML解析器解析,因此在使用它们时没有潜在的副作用,即使它们涉及锚和别名。

 类似资料:
  • 每一个前台模板根目录都会有一个manifest.json描述文件,它的结构如下: { "name": "simpleboot3",/*模板名,和目录名一样*/ "version": "1.0.0",/*模板版本号*/ "demo_url": "http://demo.thinkcmf.com",/*模板演示地址*/ "author": "ThinkCMF",/*模板作者*/ "

  • 模板描述文件 每一个前台模板根目录都会有一个manifest.json描述文件,它的结构如下: { "name": "simpleboot3",/*模板名,和目录名一样*/ "version": "1.0.0",/*模板版本号*/ "demo_url": "http://demo.thinkcmf.com",/*模板演示地址*/ "author": "ThinkCMF",/*模板作

  • 问题内容: 我正在尝试使用SCAN http://redis.io/commands/scan来遍历redis中存在的所有键。但是spring提供的Redis模板没有任何scan()方法。有什么技巧可以使用以上内容吗? 谢谢 问题答案: 您可以使用on 来这样做。

  • 我试图在类型s. t上专门化一个类。它忽略了给定类型的恒定性。在这种情况下,该类型是一个模板模板参数: 上面的代码在GCC 4.8.4和clang 5.0(with-std=c 11)中都抱怨bar在与匹配FOFType模板参数化的类一起使用时未定义。即使我删除了sfinae参数,仍然无法找到特化。 这个问题的一个例子可以在这里找到:https://godbolt.org/g/Cjci9C.在上面

  • 我有几个类遵循“模板方法”模式。抽象类A,具体扩展类B和C,如下所示: 我想编写一个测试来验证当getData()抛出某个Exception时是否抛出其他Exception。我真的希望避免模拟强制getData()抛出所需的所有复杂依赖关系。我不关心getData()如何抛出,我只想让它抛出。所以我想我要的是部分模拟。这就是我所拥有的: 这个测试在我看来很好,但当我运行它时,我得到了这样的结果:

  • 我在我的活动主题文件: 我正在尝试按Desc对产品进行排序,但产品仍然默认排序(ASC)。 如何按描述对它们进行排序?