我遇到过同样的问题。这是我使用角度文档和firebase令牌的解决方案:
getService() { const accessToken=this.afAuth.auth.currentUser.getToken().then(res=>{ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Authorization': res }) }; return this.http.get('Url',httpOptions) .subscribe(res => console.log(res)); }); }}
以下是该问题的详细答案:
将数据从Angular端传递到HTTP头中(请注意我是 在应用程序中使用Angular4.0 +)。
我们可以通过多种方式将数据传递到标头中。 语法不同但都意味着相同。
// Option 1 const httpOptions = { headers: new HttpHeaders({ 'Authorization': 'my-auth-token', 'ID': emp.UserID, }) }; // Option 2 let httpHeaders = new HttpHeaders(); httpHeaders = httpHeaders.append('Authorization', 'my-auth-token'); httpHeaders = httpHeaders.append('ID', '001'); httpHeaders.set('Content-Type', 'application/json'); let options = {headers:httpHeaders}; // Option 1 return this.http.post(this.url + 'testMethod', body,httpOptions) // Option 2 return this.http.post(this.url + 'testMethod', body,options)
在通话中,您可以找到作为标题传递的字段,如下图所示:
不过,如果您遇到类似的问题(您可能需要更改后端/ WebAPI端)
对预检请求的响应未通过访问控制检查:否 ''Access-Control-Allow-Origin''标头出现在请求的资源上。起源'' HTTP://本地主机:4200 因此不允许 访问
预检的响应没有HTTP ok状态。
找到我的详细答案 https://stackoverflow.com/a/52620468/3454221
我相信您需要在订阅之前映射结果。你这样配置:
updateProfileInformation(user: User) { var headers = new Headers(); headers.append('Content-Type', this.constants.jsonContentType); var t = localStorage.getItem("accessToken"); headers.append("Authorization", "Bearer " + t; var body = JSON.stringify(user); return this.http.post(this.constants.userUrl + "UpdateUser", body, { headers: headers }) .map((response: Response) => { var result = response.json(); return result; }) .catch(this.handleError) .subscribe( status => this.statusMessage = status, error => this.errorMessage = error, () => this.completeUpdateUser() ); }
你需要RequestOptions
let headers = new Headers({'Content-Type': 'application/json'}); headers.append('Authorization','Bearer ') let options = new RequestOptions({headers: headers}); return this.http.post(APIname,body,options) .map(this.extractData) .catch(this.handleError);
更多检查这个 链接
好。我发现了问题。
它不在Angular方面。说实话,根本没有问题。
我无法成功执行请求的原因是我的服务器应用程序未正确处理OPTIONS请求。
为什么OPTIONS,而不是POST?我的服务器应用程序位于不同的主机上,然后是前端。因为CORS我的浏览器将POST转换为OPTION: http://restlet.com/blog/2015/12/15/understanding-and-using-cors/
借助这个答案: 独立Spring OAuth2 JWT授权服务器+ CORS
我在服务器端应用程序上实现了正确的过滤器。
感谢@Supamiu - 指责我的人,我根本不发送POST。
如果你像我一样,并主演您的角度/离子打字稿,看起来像..
getPdf(endpoint: string): Observable<Blob> { let url = this.url + '/' + endpoint; let token = this.msal.accessToken; console.log(token); return this.http.post<Blob>(url, { headers: new HttpHeaders( { 'Access-Control-Allow-Origin': 'https://localhost:5100', 'Access-Control-Allow-Methods': 'POST', 'Content-Type': 'application/pdf', 'Authorization': 'Bearer ' + token, 'Accept': '*/*', }), //responseType: ResponseContentType.Blob, }); }
虽然你正在设置选项,但似乎无法弄清楚为什么他们不在任何地方..
好吧..如果你像我一样开始这个 post 从复制/粘贴 get , 然后...
post
get
改成:
getPdf(endpoint: string): Observable<Blob> { let url = this.url + '/' + endpoint; let token = this.msal.accessToken; console.log(token); return this.http.post<Blob>(url, null, { // <----- notice the null ***** headers: new HttpHeaders( { 'Access-Control-Allow-Origin': 'https://localhost:5100', 'Access-Control-Allow-Methods': 'POST', 'Content-Type': 'application/pdf', 'Authorization': 'Bearer ' + token, 'Accept': '*/*', }), //responseType: ResponseContentType.Blob, }); }