この機能に関する複数のチュートリアルが存在するため、ここでヘッダーを変更できますが、
@Injectable()
export class MyFirstInterceptor implements HttpInterceptor {
constructor(private currentUserService: CurrentUserService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.log(JSON.stringify(req));
const token: string = this.currentUserService.token;
if (token) {
req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token) });
}
if (!req.headers.has('Content-Type')) {
req = req.clone({ headers: req.headers.set('Content-Type', 'application/json') });
}
req = req.clone({ headers: req.headers.set('Accept', 'application/json') });
return next.handle(req);
}
}
しかし、私の場合、リクエストヘッダーの代わりにリクエストボディを追加する必要があるトークンがあるので、ボディを変更する方法があります。
更新:Mild Fuzzのメソッドは単純なポストリクエストに対してはうまく機能しますが、GETリクエストの場合はクエリに追加し、ボディを追加できる場合はボディに追加したいと思います。そして最も重要なことは、フォームデータを送信しようとしたときに壊れました。
...request.body
はフォームデータを削除し、それをJSON
objectに変換して、画像が消えるようにします。
マイルドファズのおかげで私は望んでいたものでしたが、私の場合、いくつかの合併症がありましたが、これは頭痛の種で解決できました。最終的な実装は次のとおりです。
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
console.log('Intercepted!', req);
const authService = this.injector.get(AuthService);
const reqCloned = this.handleBodyIn(req, localStorage.getItem('random_key'), 'random_key_added');
const copiedReq = reqCloned;
return next.handle(copiedReq);
}
handleBodyIn(req:HttpRequest<any>, tokenToAdd, tokenName) {
if (req.method.toLowerCase() === 'post') {
if (req.body instanceof FormData) {
req = req.clone({
body: req.body.append(tokenName, tokenToAdd)
})
} else {
const foo = {}; foo[tokenName] = tokenToAdd;
req = req.clone({
body: {...req.body, ...foo}
})
}
}
if (req.method.toLowerCase() === 'get') {
req = req.clone({
params: req.params.set(tokenName, tokenName)
});
}
return req;
}
}
req = req.clone({
headers: req.headers.set('Accept', 'application/json'),
body: {...req.body, hello: 'world' }});
このようなもの?