Мы используем SwaggerEditor для написания спецификаций API OAS3.Теперь мы хотели бы перейти к более организованной настройке, где мы перемещаем общие определения, которые часто используются (например, некоторые параметры, ошибки, типы объектов), в некоторый общий файл, на который ссылаются другие API .
OAS3 поддерживает это, используя обычное ключевое слово $ref
, например:
$ref: "http://example.com/shared.yaml#/components/schemas/Person"
То, что мы пробовали до сих пор
Мы используем абсолютURL , т.е. не относительный путь.
Мы запускаем SwaggerEditor с параметром запроса url=
, указывающим на наш файл спецификации.
-> УказанныйURL общего файла API отображается в части редактора Swagger UI (справа) под заголовком API службы, поэтому, похоже, это работает.
Ссылка, на которую я пыталсяЯ использую абсолютный URL-адрес для файла YAML, который я размещаю на той же машине, что и редактор swagger (в Apache Tomcat).Например:
$ref: "http://127.0.0.1:8080/foo/bar.yaml#/components/schemas/Person"
Мне удается запустить SwaggerEditor без ошибки CORS (это часто встречается при поиске этой проблемы, а также с нами в первую очередь).Я могу проверить в консоли браузера:
- Внешний файл YAML фактически отправлен с необходимым заголовком CORS (
Access-Control-... *
) - В консоли браузера нет других ошибок.
НО внешняя ссылка по-прежнему не разрешена : редактор фактически не проверяет, является ли данное определение (в приведенном выше примере Person
)существует - поэтому, если я ссылаюсь на какое-то поддельное слово, ошибка не отображается.Кроме того, интерактивная часть пользовательского интерфейса Swagger справа не отображает связанный тип должным образом ... Т.е. он не работает должным образом.
Не проблема CORS
(Сначала мы тоже столкнулись с этой проблемой, но теперь решили ее, выполнив следующие шаги.)
Я удостоверился в установке соответствующих заголовков CORS для общего YAML (bar.yaml
выше), т.е. установите фильтр в web.xml Apache Tomcat.Я проверил, что запрос к файлу YAML получает заголовки CORS - я получаю ...
Access-Control-Allow-Origin *
При открытии SwaggerEditor не забудьте очиститьСначала кешируется браузер, поскольку может случиться так, что браузер по-прежнему будет кэшировать запрос к указанному внешнему файлу YAML и таким образом запоминает отсутствующий заголовок CORS.Это может привести к тому, что SwaggerEditor отобразит ошибку CORS 1 , , даже несмотря на то, что на сервере тем временем обслуживается указанный ресурс с правильным заголовком .Более подробную информацию об ошибке можно также найти в консоли разработчика браузера 2 .
После очистки кэша мой SwaggerEditor снова корректно загрузил файл, увидел заголовок CORS иперестал выдавать ошибку CORS.
1 Это ошибка, отображаемая editor.swagger.io:
Ошибки
Ошибка выборки
Не удалось получить http://127.0.0.1:8080/foo/bar.yaml
Ошибка выборки
Возможна ли проблема перекрестного происхождения (CORS)?Источник URL (http://127.0.0.1:8080) не соответствует странице (http://editor.swagger.io). Проверьте, что сервер возвращает правильные заголовки 'Access-Control-Allow- *'.
2 Ошибка, отображаемая консолью JS браузера при попытке загрузить API с внешней ссылкой:
Доступ к выборке в 'http://127.0.0.1:8080/foo/bar.yaml' от источника' http://editor.swagger.io' был заблокирован политикой CORS: в запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Если непрозрачный ответ удовлетворяет ваши потребности, установите режим запроса «no-cors» для извлечения ресурса с помощью CORSотключено.