在 Angular 8.1.3 中将 HttpHeaders 添加到 http.get() 无法命中 API 端点
Adding HttpHeaders to http.get() in Angular 8.1.3 fails to hit API endpoint
我正在使用 Angular 8.1.3 对 RESTful API 端点执行 HTTP GET:
export class AnalysisService {
private analysisUrl = 'https://localhost:44367/api/analysis'; // URL to web api
httpOptions = {
headers: new HttpHeaders({ 'apiKey': 'xxxxx' })
};
constructor(
private http: HttpClient) { }
/** GET analysis by id. Will 404 if id not found */
getAnalysis(id: number): Observable<PresentedAnalysis> {
const url = `${this.analysisUrl}/${id}`;
console.log('url: ' + url);
return this.http.get<PresentedAnalysis>(url, this.httpOptions).pipe(
tap(_ => this.log(`fetched analysis id=${id}`)),
catchError(this.handleError<PresentedAnalysis>(`getAnalysis id=${id}`))
);
}
如果我从 http.get() 参数列表中删除 this.httpOptions,此代码可以正常工作——它会在我的 API 端点上命中我的断点。但是,当我在 http.get() 调用中包含 this.httpOptions 时,我的断点没有命中,并且以下内容被记录到 Chrome 控制台:
我做错了什么?
正如@JoelJoseph 回答的那样,CORS 策略应该在服务器端处理。您的服务器预期的 headers 也可能会有所不同。大多数 API 端点接受 'Authorization' header 用于身份验证目的,其中 header 值应以 'Bearer ' 为前缀。如果服务器不允许某些 header,在您的情况下 'apiKey',也可能会发生 CORS 错误。请验证 api.
允许的 header
我能够解决这个问题。我的 angular 应用程序在 4200 上,我的 ASP.NET 核心 API 在端口 44367 上——因此出现了 CORS 问题。
我按照 Rick Strahl 的精彩 post 在我的 API 上为环境 == 开发配置了 CORS:https://weblog.west-wind.com/posts/2016/sep/26/aspnet-core-and-cors-gotchas
然后我将 API 键添加到我的 Angular 服务中的 GET 请求,如下所示:
httpOptions = {
headers: new HttpHeaders({
'Authorization': 'Basic NjgzOUY3OEItRTk5Ni00MkUxLTg2QjktMTIxNjlGRDM3QTg2Og==',//todo don't hardcode
})
};
现在可以使用了!谢谢大家指点
我正在使用 Angular 8.1.3 对 RESTful API 端点执行 HTTP GET:
export class AnalysisService {
private analysisUrl = 'https://localhost:44367/api/analysis'; // URL to web api
httpOptions = {
headers: new HttpHeaders({ 'apiKey': 'xxxxx' })
};
constructor(
private http: HttpClient) { }
/** GET analysis by id. Will 404 if id not found */
getAnalysis(id: number): Observable<PresentedAnalysis> {
const url = `${this.analysisUrl}/${id}`;
console.log('url: ' + url);
return this.http.get<PresentedAnalysis>(url, this.httpOptions).pipe(
tap(_ => this.log(`fetched analysis id=${id}`)),
catchError(this.handleError<PresentedAnalysis>(`getAnalysis id=${id}`))
);
}
如果我从 http.get() 参数列表中删除 this.httpOptions,此代码可以正常工作——它会在我的 API 端点上命中我的断点。但是,当我在 http.get() 调用中包含 this.httpOptions 时,我的断点没有命中,并且以下内容被记录到 Chrome 控制台:
我做错了什么?
正如@JoelJoseph 回答的那样,CORS 策略应该在服务器端处理。您的服务器预期的 headers 也可能会有所不同。大多数 API 端点接受 'Authorization' header 用于身份验证目的,其中 header 值应以 'Bearer ' 为前缀。如果服务器不允许某些 header,在您的情况下 'apiKey',也可能会发生 CORS 错误。请验证 api.
允许的 header我能够解决这个问题。我的 angular 应用程序在 4200 上,我的 ASP.NET 核心 API 在端口 44367 上——因此出现了 CORS 问题。
我按照 Rick Strahl 的精彩 post 在我的 API 上为环境 == 开发配置了 CORS:https://weblog.west-wind.com/posts/2016/sep/26/aspnet-core-and-cors-gotchas
然后我将 API 键添加到我的 Angular 服务中的 GET 请求,如下所示:
httpOptions = {
headers: new HttpHeaders({
'Authorization': 'Basic NjgzOUY3OEItRTk5Ni00MkUxLTg2QjktMTIxNjlGRDM3QTg2Og==',//todo don't hardcode
})
};
现在可以使用了!谢谢大家指点