Вопрос или проблема
Когда я пытаюсь использовать Swagger на моем локальном хосте, приложение работает правильно (API работает), но я сделал развертывание на Railway, и когда я пытаюсь протестировать API из Swagger, я получаю эту ошибку:
Не удалось получить данные.
Возможные причины:
CORS
Сетевая ошибка
Схема URL должна быть “http” или “https” для CORS-запроса.
Я думаю, что это происходит потому, что в локальном приложении я делаю запрос с помощью http-ссылки, но в развернутой версии на Railway она автоматически была установлена на https, может ли это быть причиной ошибки?
Я попытался добавить в свое приложение WebConfig:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*");
}
}
Но это не помогло, я все еще получаю ту же ошибку
!!!!! Когда я делаю запрос из Postman, я получаю правильный ответ с этой ссылкой (это GET-запрос): https://exciting-wonder-production.up.railway.app/country, но из Swagger я получаю ошибку:
Не удалось получить данные.
Возможные причины:
CORS
Сетевая ошибка
Схема URL должна быть “http” или “https” для CORS-запроса.
Попробуйте обновить класс конфигурации Swagger и Swagger UI, чтобы использовать правильный https URL для API:
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.servers(List.of(new Server().url("https://exciting-wonder-production.up.railway.app")));
}
}
Замените .allowedOrigins(“*”) на ваш развернутый URL .allowedOrigins(“https://exciting-wonder-production.up.railway.app”)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://exciting-wonder-production.up.railway.app")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true);
}
}
Ответ или решение
Решение проблемы CORS с использованием Swagger в приложении Spring Boot
При использовании Swagger для документирования и тестирования вашего API возникла проблема с ошибкой «Failed to fetch. Possible Reasons: CORS, Network Failure, URL scheme must be "http" or "https" for CORS request». Это распространенная проблема, связанная с механизмом Cross-Origin Resource Sharing (CORS), и давайте разберем возможные причины и способы ее устранения.
Основные причины возникновения проблемы
-
Неправильные настройки CORS: Если ваше приложение на Spring Boot не настроено для обработки запросов с других источников, браузер блокирует такие запросы, что приводит к ошибке CORS.
-
Несоответствие схемы URL: Если вы используете
http
для запросов на сервер, который поддерживает толькоhttps
, это может вызвать ошибки. browsers условно блокируют такие запросы. -
Конфигурация Swagger: Swagger UI может не соответствовать правильному URL-адресу, что также может привести к проблемам.
Шаги для решения проблемы
-
Настройка CORS:
Вам уже удалось добавить класс конфигурацииWebConfig
, но необходимо отредактировать его так, чтобы разрешить запросы только из вашего настроенного URL. Это поможет ограничить доступ к вашему API с определённых источников.@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("https://exciting-wonder-production.up.railway.app") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .allowCredentials(true); } }
Заменив
allowedOrigins("*")
на ваш URL, вы ограничиваете доступ к API только с этого приложения Swagger. -
Конфигурация Swagger:
Обновите конфигурацию Swagger, чтобы указать правильный URL-адрес вашего API. Это гарантирует, что Swagger ссылается на ваш API через HTTPS.@Configuration public class SwaggerConfig { @Bean public OpenAPI customOpenAPI() { return new OpenAPI() .servers(List.of(new Server().url("https://exciting-wonder-production.up.railway.app"))); } }
-
Проверка окружения:
Убедитесь, что ваше приложение настроено правильно для работы с HTTPS. Если для локальной разработки используетсяhttp
, проверьте, что все ссылки корректны при развертывании. -
Тестирование через Postman:
Если вы можете сделать запрос через Postman, это подтверждает, что API работает, и проблема в конфигурации CORS или Swagger. Обратите внимание на то, что Postman не использует CORS и не подвержен таким же ограничениям, как браузеры. -
Кеш браузера:
Иногда кеш браузера может сохранить старые записи. Попробуйте очистить кеш или использовать режим инкогнито, чтобы протестировать изменения.
Заключение
Если вы следовали всем указанным шагам и все еще сталкиваетесь с проблемами, возможно, стоит изучить логи вашего приложения на предмет других ошибок, которые могут указывать на проблемы с сетевыми соединениями. Также убедитесь, что ваш сервер Railway настроен правильно для обработки CORS-запросов и что все зависимости вашего приложения актуальны.
Надеюсь, это поможет вам решить проблему с CORS при использовании Swagger на вашем API, развернутом в Railway!