Как создать сервисы Aurelia без конфигурации избыточного заголовка?
В настоящее время я работаю над проектом, использующим Aurelia в качестве интерфейсной среды, и мне интересно, есть ли более красноречивый и менее избыточный способ установки заголовка запроса в моих службах API. Ниже приведен пример.
В этом Post
сервис, я создал configureHeaders
метод, который я вызываю перед каждым вызовом API, потому что в противном случае я сталкиваюсь со случаем, когда веб-токен изменился, но заголовок запроса не обновился. При создании этого configureHeaders
метод - это функциональный обходной путь, я должен сделать это для каждого из моих сервисов, и он чувствует себя очень излишним.
Есть ли способ настроить заголовок запроса в масштабах приложения, чтобы мне не нужно было создавать configureHeaders
метод для каждой услуги и вызывать его для каждого запроса?
import {inject} from 'aurelia-framework';
import {HttpClient} from 'aurelia-http-client';
import environment from 'environment';
@inject(HttpClient)
export class Post {
constructor(http) {
this.http = http;
}
configureHeaders() {
this.token = window.localStorage.getItem('token') || null;
this.http = this.http
.configure(x => {
x.withBaseUrl(environment.serverBaseURL);
x.withHeader('Authorization', `Bearer ${this.token}`);
});
}
getPosts() {
this.configureHeaders();
return this.http.get('post')
.then(posts => {
return JSON.parse(posts.response);
});
}
}
1 ответ
Как отметил Р.Ричардс, HttpClient Interceptor от Aurelia - это то, что вам нужно.
Вот пример класса - в отличие от объекта с анонимными функциями
1.) Объявить перехватчик
import {Interceptor, HttpResponseMessage, RequestMessage} from 'aurelia-http-client'
export class CustomInterceptor implements Interceptor {
request(request: RequestMessage): RequestMessage {
//Do request interceptor here
return request;
}
response(response: HttpResponseMessage): HttpResponseMessage{
//Do response interception here
return response;
}
}
2.) Зарегистрируйте перехватчик как часть вашего http-клиента по умолчанию в вашем main.js
import {CustomInterceptor} from 'path/to/custom-interceptor'
...
...
http.configure(config => {
//config stuff here
).withInterceptor(new CustomInterceptor())
Это должно соответствовать вашему красноречию!