有点背景,我有一个Golang后端微服务,可以处理帖子的CRUD操作。我已经用Postman,浏览器对其进行了测试,它可以完成所需的工作。当我将它与最终部署的Angular前端捆绑在一起时,就会出现问题。可以说后端正确地在响应中公开了CORS标头,并且还向客户端请求了授权密钥,以便对微服务进行任何处理。该密钥需要通过标头提供。现在,由于我进行的每个请求都需要某种类型的密钥,因此我决定使用Angular的HTTP拦截器来完成此工作。这是我得到的:
在我的Angular前端的post.service中
allPosts(): Observable<HttpResponse<Post[]>> {
const url = environment.POST_SERVICE_URL + '/user/post';
console.log('Hitting URL: ' + url + ' with key: ' + environment.POST_SERVICE_KEY);
return this.http.get<Post[]>(url, {observe: 'response'}).pipe(catchError(this.handleError));
}
然后在拦截器中
@Injectable()
export class AppHttpInterceptor implements HttpInterceptor {
constructor() {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.log(req);
const r = req.clone();
r.headers.set('Authorisation-Key', environment.POST_SERVICE_KEY);
return next.handle(r);
}
}
我的应用模块:
@NgModule({
declarations: [
AppComponent,
PostsComponent,
],
imports: [
BrowserModule,
AppRoutingModule,
HttpClientModule
],
providers: [{
provide: HTTP_INTERCEPTORS,
useClass: AppHttpInterceptor,
multi: true
}],
bootstrap: [AppComponent]
})
export class AppModule { }
因此,我希望拦截器克隆请求,然后将密钥添加到该克隆的请求中,然后将其发送出去。这至少是我对这种拦截器如何工作的理解。好吧,它实际上不起作用。我的后端没有收到密钥,只是抛出一个错误。问题不在于后端,因为如果我手动打开授权标头(通过Firefox附加组件),那么它将正确输出密钥,并且能够照常继续。只有当我使用拦截器时,一切都会变成梨形。
现在,也许您可以在这里看到我做错了什么;为什么angular不设置标题,我如何诊断实际发送的标题是什么?在我看来,Angular覆盖了我要放入的任何标题。