Напишите swagger doc, который использует несколько типов контента, например application/json и application/x-www-form-urlencoded (без дублирования)


Я ищу элегантный способ определить api, который может потреблять данные JSON, а также данные формы. Следующий фрагмент работает, но он не элегантен и требует всего вида уродливого кода в бэкэнде. Есть ли лучший способ определить это?

Что работает прямо сейчас:

paths:
  /pets:
    post:
      consumes:
      - application/x-www-form-urlencoded
      - application/json
      parameters:
      - name: nameFormData
        in: formData
        description: Updated name of the pet
        required: false
        type: string
      - name: nameJSON
        in: body
        description: Updated name of the pet
        required: false
        type: string

Основная идея того, как я хотел бы, чтобы это работало:

paths:
  /pets:
    post:
      consumes:
      - application/x-www-form-urlencoded
      - application/json
      parameters:
      - name: name
        in: 
        - formData
        - body
        description: Updated name of the pet
        required: true
        type: string
Но это не работает, потому что значение in должно быть строкой, а не массивом.

Есть хорошие идеи?

1 4

1 ответ:

В OpenAPI 2.0 нет способа описать это. Параметры формы и тела являются взаимоисключающими, поэтому операция может иметь либо данные формы, либо тело JSON, но не оба. Возможный обходной путь-иметь две отдельные конечные точки - одну для данных формы и другую для JSON - если это приемлемо в вашем сценарии.

Тем не менее, это будет возможно в OpenAPI 3.0 (который является RC на момент написания статьи). 3.0 вводит ключевое слово requestBody, которое используется для определения возможных типов контента, поэтому мы сможем иметь application/json и application/x-www-form-urlencoded в одной операции. Разные типы контента могут иметь одну и ту же схему или разные схемы.

Когда 3.0 выйдет и оснастка будет обновлена, ваш пример можно описать следующим образом:

paths:
  /pets:
    post:
      requestBody:
        required: true
        content:

          application/json:
            schema:
              $ref: '#/components/schemas/Pet'

          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/Pet'

       responses:
         '200':
            description: OK

components:
  schemas:
    Pet:
      type: object
      properties:
        name:
          type: string
          description: Updated name of the pet
      required:
        - name

Далее информация: