Создание ответа OpenAPI, включая oneOf и, возможно, allOf - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь создать ответ из множества компонентов схемы, используя OpenAPI 3. Ответ состоит из трех частей:

  1. Общий компонент, который используют другие конечные точки (т. Е. Success /флаги сбоя).- #/components/schemas/core_response_schema внутри allOf.
  2. Свойства, которые все отклики на использование этой конечной точки (т. Е. user_id) - компонент properties ниже.
  3. Одна из нескольких схем, которые будут различаться в зависимости от типа пользователя.- компонент oneOf.

Я определил, что должен использовать allOf, чтобы иметь возможность смешивать свойства (элемент 2) и отклик ядра (элемент 1), хотя это выглядитнеправильно, так как есть только один элемент.Я попробовал $ref, но он не сработал.

В приведенном ниже примере успешно проходят три различных инструмента линтинга OpenAPI, но в построенном примере Swagger UI не показывает вещи (свойства) элемента 2,и показывает все вещи элемента 3 (должно быть oneOf).

"responses": {
    "200": {
        "description": "Operation successfully executed.",
        "content": {
            "application/json": {
                "schema": {
                    "properties": {
                        "user_id": {
                            "$ref": "#/components/schemas/user_id"
                        },
                        "results": {
                            "type": "array",
                            "items": {
                                "$ref": "#/components/schemas/result_user_by_id"
                            }
                        }
                    },
                    "type": "object",
                    "allOf": [
                        {
                            "$ref": "#/components/schemas/core_response_schema"
                        }
                    ],
                    "oneOf": [
                        {
                            "$ref": "#/components/schemas/user_type_a"
                        },
                        {
                            "$ref": "#/components/schemas/user_type_b"
                        },
                        {
                            "$ref": "#/components/schemas/user_type_c"
                        }
                    ]
                }
            }
        }
    }
},
"components": {
    "schemas": {
        "core_response_schema": {
            "properties": {
                "success": {
                    "description": "A flag indicating whether the request was successfully completed or not.",
                    "type": "boolean"
                },
                "num_results": {
                    "description": "The number of results for this request",
                    "type": "integer"
                }
            },
            "type": "object"
        },
        "user_id": {
            "description": "Unique 10 character `user_id`.",
            "type": "string",
            "maxLength": 10,
            "minLength": 10,
            "example": "a1b2c3d4e5"
        },
    }
}

И пример полезной нагрузки для двух пользователей.Введите A и B (это надуманный пример).

Пользовательский тип A:

{
    "success": true,
    "num_results": 1,
    "user_id": "c1b00cb714",
    "results": [{
            "user_type": "a",
            "group_id": "e7a99e3769",
            "name": null,
            "title": null,
            ... (and so on until we get to the stuff that's unique to this type of user) ...
            "favourite_artworks": [
                "sunflowers",
                "landscapes"
            ],
            "artwork_urls": [
                "http://sunflowers.example"
            ]
        }
    ]
}

Пользовательский тип B:

{
    "success": true,
    "num_results": 1,
    "user_id": "c1b00cb715",
    "results": [{
            "user_type": "B",
            "group_id": "e7a99e3769",
            "name": null,
            "title": null,
            ... (and so on until we get to the stuff that's unique to this type of user) ...
            "supported_charities": [
                "UN Foundations"
            ],
            "charity_urls": [
                "http://www.un.int"
            ],
        }
    ]
}

Какой правильный способ объединенияразные схемы и свойства в OpenAPI?Правильно ли это, и Swagger UI просто не может с этим справиться?

И как вы смешиваете схему со свойствами, не используя allOf?

Это говорит о том, что это возможно: Схема Swagger: oneOf, anyOf, allOf действительны одновременно?

1 Ответ

0 голосов
/ 15 декабря 2018

После дальнейшего изучения я определил, что это ошибка в swagger-ui - https://github.com/swagger-api/swagger-ui/issues/3803 - они просто не поддерживают oneOf (или anyOf) в настоящее время.

Что касается, по крайней мере, трех различных инструментов для рисования, смесь anyOf, oneOf и allOf может использоваться вместе в одной и той же схеме.

Redoc, похоже, имеет аналогичные проблемы - https://github.com/Rebilly/ReDoc/issues/641

...