Избегайте шаблонов в Swagger 2.0

Мои API-интерфейсы уважают обычные коды состояния, и я обнаружил, что повторяю один и тот же текст в части ответов моего определения API.

404:
          description: The resource doesn't exist
          schema:
            $ref:   '#/definitions/Error'
default:
          description: An unexpected error has occurred
          schema:
            $ref:   '#/definitions/Error'

Похожая проблема, с которой я также сталкиваюсь, заключается в том, что я не могу выделить свойства и параметры перечисления. Может ли мой код Swagger стать более сухим?


person Edmondo1984    schedule 12.06.2016    source источник


Ответы (1)


Да, ваш код может стать гораздо более сухим: спецификация OpenAPI (fka. Swagger) предлагает множество способов факторизации вещей, включая ответы, параметры и перечисления.

Многократно используемые ответы

Вы можете определить повторно используемый ответ почти так же, как вы определили Error в своем примере.

Сначала добавьте ответ, например Standard404, определение в responses на корневом уровне

responses:
  Standard404:
    description: The resource doesn't exist
    schema:
      $ref: '#/definitions/Error'

Затем используйте его с $ref : '#/responses/Standard404' для кода состояния 404 в responses для любой операции.

responses:
  404:
    $ref: '#/responses/Standard404'

Повторно используемые параметры

Для повторно используемых параметров это то же самое.

Сначала добавьте параметр, например ID, определение в parameters на корневом уровне:

parameters:
  ID:
    name: id
    in: path
    required: true
    type: string

Затем используйте его в любом списке параметров с $ref: '#/parameters/ID'. Совет: параметры можно определить на уровне операции, а также на уровне пути:

  /other-resources/{id}:
    get:
      parameters:
        - $ref: '#/parameters/ID'

 /resources/{id}:
    parameters:
      - $ref: '#/parameters/ID'

Повторно используемые перечисления

Все, что вам нужно сделать, это определить определение типа string (или целое число, или число) с перечислением:

SomeValueWithEnum:
    type: string
    enum:
      - a value
      - another value

А затем используйте его столько раз, сколько пожелаете, вот так:

 Resource:
    properties:
      dummyProperty:
        $ref: '#/definitions/SomeValueWithEnum'

Полный пример

Вот полный пример для этих 3 вариантов использования:

swagger: '2.0'

info:
  version: 1.0.0
  title: API
  description: Reusable things example

paths:

  /resources:
    post:
      responses:
        200:
          description: OK
        default:
          $ref: '#/responses/Default'

  /resources/{id}:
    parameters:
      - $ref: '#/parameters/ID'
    get:
      responses:
        200:
          description: OK
        404:
          $ref: '#/responses/Standard404'
        default:
          $ref: '#/responses/Default'
    delete:
      responses:
        200:
          description: OK
        404:
          $ref: '#/responses/Standard404'
        default:
          $ref: '#/responses/Default'

  /other-resources/{id}:
    get:
      parameters:
        - $ref: '#/parameters/ID'
      responses:
        200:
          description: OK
        404:
          $ref: '#/responses/Standard404'
        default:
          $ref: '#/responses/Default'

definitions:
  Error:
    properties:
      message:
        type: string

  SomeValueWithEnum:
    type: string
    enum:
      - a value
      - another value

  Resource:
    properties:
      dummyProperty:
        $ref: '#/definitions/SomeValueWithEnum'

  AnotherResource:
    properties:
      anotherDummyProperty:
        $ref: '#/definitions/SomeValueWithEnum'

parameters:
  ID:
    name: id
    in: path
    required: true
    type: string

responses:
  Standard404:
    description: The resource doesn't exist
    schema:
      $ref: '#/definitions/Error'
  Default:
    description: An unexpected error has occurred
    schema:
      $ref:   '#/definitions/Error'

Подробнее об этом Вы должны прочитать это учебник (раскрытие: я написал его) и OpenAPI Спецификация.

person Arnaud Lauret    schedule 13.06.2016
comment
Можно ли также исключить перечисления? - person Edmondo1984; 05.07.2016
comment
@ Edmondo1984 Edmondo1984 Если факторизовать перечисления означает, могу ли я определить повторно используемое перечисление, ответ - нет. Все, что вы можете сделать, это определить повторно используемое свойство с перечислением (как показано в моем ответе). Может быть, мне следует добавить эту точность к моему ответу. Правильно ли я понимаю ваш комментарий? - person Arnaud Lauret; 06.07.2016