В моем угловом приложении я хочу включать токен пользователя в каждый из моих http-запросов, поэтому для того, что я узнал, лучше всего создать службу, чтобы мне не приходилось вручную включать свой токен или другой параметр каждый раз для моего http-запроса. Код может быть таким:
export class FacilityService{
constructor(private http: HttpClient) {
}
const httpOptions = {
header: new HttpHeaders({
Authorization: `bearer ` + JSON.parse(localStorage.GetItem('user')).token
})
}
load(): Observable<any> {
return this.http.get<any>(
`${environment.rootUrl}/facility/getFacility`, httpOptions
);
}
}
Однако я также научился использовать службу для хранения состояния. Таким образом, нам не нужно каждый раз запрашивать у сервера. Код может понравиться так:
export class FacilityService{
facility: Facility[] = [];
constructor(private http: HttpClient) {
}
const httpOptions = {
header: new HttpHeaders({
Authorization: `bearer ` + JSON.parse(localStorage.GetItem('user')).token
})
}
load(): Observable<any> {
if (this.facility.length > 0) return of(this.facility);
return this.http.get<any>(
`${environment.rootUrl}/facility/getFacility`, httpOptions
).pipe(map(facility =>
this.facility = facility;
return facility;
));
}
}
2 вопрос:
если я предполагаю создать локальное состояние для всех HTTP-запросов всех моих объектов? Каждый раз, когда я сначала проверяю локальные данные, и если они не существуют, я запрашиваю их у сервера. И у меня будет обслуживание объектов, обслуживание пользователей, обслуживание заказов.
Как мне объединить все эти службы в одну службу, чтобы мне не приходилось создавать службу для каждой из моих сущностей? например, данные о пользователях и данные о заказах также могут совместно использоваться сервисом.





Во-первых, если вам нужно добавить заголовок или что-то еще в КАЖДЫЙ HTTP-запрос, я бы создал перехватчик; не использовать какой-либо родительский сервис.
если я предполагаю создать локальное состояние для всех HTTP-запросов всех моих объектов? Каждый раз, когда я сначала проверяю локальные данные, и если они не существуют, я запрашиваю их у сервера.
Как правило, я бы отделил управление состоянием от кода интеграции службы, чтобы мой код для доступа к удаленным серверам не сохранял никакого состояния.
Для локального кэширования существуют некоторые типы данных, для которых имеет смысл кэшировать данные локально, и другие типы данных, для которых это никогда не требуется. Для тех, кому это нужно, вы можете использовать наблюдаемое в сервисе и shareReplay().
Как мне объединить все эти службы в одну службу, чтобы мне не приходилось создавать службу для каждой из моих сущностей? Например, данные пользователей и данные о заказах также могут совместно использоваться сервисом.
Я рекомендую создать отдельный сервис для всех сущностей. Скорее всего, данные пользователей и данные о заказах представляют собой разные схемы данных с разными конечными точками, и я не уверен, какие вещи будут «разделяться» между ними, если они еще не инкапсулированы в класс HTTPClient Angular.
Могу ли я также спросить, что является наилучшей практикой, если я хочу отправить идентификатор пользователя и текущий идентификатор объекта в каком-либо HTTP-запросе? Вручную добавлять в мой сервис каждый раз?