Напишите 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 ответ:
В 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
Далее информация: