我目前正在开发一个使用Aurelia作为前端框架的项目,我想知道在我的API服务中设置请求标头是否有更有说服力且更少冗余的方式。以下是一个例子。
在此Post
服务中,我创建了一个configureHeaders
方法,我在每个API调用之前调用该方法,否则,我会遇到Web令牌已更改但请求标头未更新。虽然创建此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);
});
}
}
答案 0 :(得分:1)
正如R.Richards评论的那样,Aurelia的HttpClient拦截器就是你所追求的。
这是一个类示例 - 与具有匿名函数的对象
相对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。)将拦截器注册为main.js
中默认http客户端的一部分import {CustomInterceptor} from 'path/to/custom-interceptor'
...
...
http.configure(config => {
//config stuff here
).withInterceptor(new CustomInterceptor())
这应该适合你的口才!