Проблема, с которой я недавно столкнулся при запуске нового проекта с использованием Spring Boot и Angular, заключается в правильном доступе/использовании бэкенд API для предоставления данных клиенту.
Я разработал очень простое CRUD приложение, которое просто отвечает за отображение списка сотрудников.
API url для получения списка сотрудников: http://localhost:8080/api/v1/employees и ответ выглядел следующим образом:
Теперь я хотел использовать свой API для доставки данных клиенту/приложениюangular. Я создал employee.service, который просто выполняет вызов API.
import {Injectable} from '@angular/core';
import {HttpClient} from "@angular/common/http";
import {Observable} from "rxjs";
import {Employee} from "../model/employee";
@Injectable({
providedIn: 'root'
})
export class EmployeeService {
private baseURL = "/api/v1/employees"
constructor(private httpClient: HttpClient) {
}
getEmployeesList(): Observable<Employee[]> {
return this.httpClient.get<Employee[]>(`${this.baseURL}`)
}
}
Когда я обновил свое приложение, я заметил в firebug, что был вызов к API, которого не существовало. Вызов был на порт 4200, а не на 8080 — порт моего бэкенда. Вот эта ошибка, которую я получил:
Конечно, я могу жестко закодировать полный url в моем сервисе, используя localhost:8080, так что это будет:
private baseURL = "http://localhost:8080/api/v1/employees"
но это, конечно, не лучший вариант, особенно если вы собираетесь рано или поздно развернуть приложение на рабочем сервере. Тем не менее, чтобы посмотреть, что произойдет, я изменил url в сервисе и проверил, что произошло. Я увидел хорошо известную ошибку CORS
Правильным решением этой проблемы является использование прокси!
Вам нужно создать новый файл proxy.config.json и добавить в него соответствующую конфигурацию, чтобы angular делал вызовы ко всем конечным точкам API, используя именно эту конфигурацию. В моем случае этот файл выглядел следующим образом:
{
"/api/*": {
"target": "http://localhost:8080",
"secure": false,
"logLevel": "debug"
}
}
Файл должен быть помещен в корневую папку проекта angular. Как вы можете видеть, здесь определено несколько вещей:
-
/api/* — все обращения к этому урлу должны использовать ‘target’ url
-
secure: false — мы не используем https
-
logLevel: debug — может быть очень полезным.
Последнее, что нужно сделать, это изменить файл package.json, в определении ng start, теперь он должен включать использование файла прокси. Это должно быть сделано следующим образом:
"scripts": {
"ng": "ng",
"start": "ng serve --proxy-config proxy.config.json",
"build": "ng build",
"watch": "ng build --watch --configuration development",
"test": "ng test"
},
Теперь, когда я запускаю ng start, все данные наконец-то передаются от внутреннего приложения к клиенту.
И это все! Я надеюсь, что это поможет кому-нибудь однажды
https://developersmill.com/