Angular 在 HTTP 调用之前异步获取授权令牌
Angular getting Authorization token asynchronously before HTTP calls
在发布这篇文章之前,我去了很多其他类似的问题,但找不到解决方案。喜欢
我正在使用 AWS 会话,它为我提供了用于发出 HTTP 请求的授权令牌。现在获取会话可以是异步操作,具体取决于刷新令牌的需要。
问题:
我无法链接获取会话然后进行 HTTP 调用。
版本 Angular 5、RxJs 5.5.2
AuthService的get session函数。
getSession(): Observable<any> {
const sessionOb = new Subject<CognitoUserSession>();
// AysnFn4session is a callback implementation
AysnFn4session((err, session) => {
console.log('Found Session');
sessionOb.next(session);
sessionOb.complete();
});
return sessionOb;
}
API 服务的 get 函数 - Trail 1
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this._authService.getSession().switchMap((session) => {
console.log('dasdasd');
let token = '';
if (session) {
token = session.getIdToken().getJwtToken();
options = options || {};
options.headers = options.headers || new Headers();
options.headers.append('Authorization', token);
}
return this._http.get(url, options);
});
}
API 服务的 get 函数 - Trail 2
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this._authService.getSession().pipe(mergeMap((session) => {
console.log('So what??');
let token = '';
if (session) {
token = session.getIdToken().getJwtToken();
options = options || {};
options.headers = options.headers || new Headers();
options.headers.append('Authorization', token);
}
return this._http.get(url, options);
}));
}
我是这样称呼这个的 api.
getItemInfo(item) {
return this._apiHttp.get('/assets/data/item.json')
.map(res => {
console.log(res);
return res.json();
})
.subscribe(data => console.log(data),
err => console.log(err),
() => console.log('done'));
}
现在的问题是在这两种情况下都是控制台 prints.and 而不是进行 http 调用。
Found Session
done
我无法理解我在使用 switchmap 的 mergermap 来完成 http 请求时哪里出错了。
错误在getSession()
。您的 AsynFn4session 回调在主题的观察者正在收听之前完成。 (一个主题的观察者只接收在它订阅后发出的值)。这意味着观察者永远不会收到主题发射,因此可观察序列不会继续。我会使用 observable 而不是 subject
getSession(): Observable<any> {
return new Observable(observer => {
AsynFn4session((err, session) => {
observer.next(session);
observer.complete();
});
});
}
在发布这篇文章之前,我去了很多其他类似的问题,但找不到解决方案。喜欢
我正在使用 AWS 会话,它为我提供了用于发出 HTTP 请求的授权令牌。现在获取会话可以是异步操作,具体取决于刷新令牌的需要。
问题: 我无法链接获取会话然后进行 HTTP 调用。
版本 Angular 5、RxJs 5.5.2
AuthService的get session函数。
getSession(): Observable<any> {
const sessionOb = new Subject<CognitoUserSession>();
// AysnFn4session is a callback implementation
AysnFn4session((err, session) => {
console.log('Found Session');
sessionOb.next(session);
sessionOb.complete();
});
return sessionOb;
}
API 服务的 get 函数 - Trail 1
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this._authService.getSession().switchMap((session) => {
console.log('dasdasd');
let token = '';
if (session) {
token = session.getIdToken().getJwtToken();
options = options || {};
options.headers = options.headers || new Headers();
options.headers.append('Authorization', token);
}
return this._http.get(url, options);
});
}
API 服务的 get 函数 - Trail 2
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this._authService.getSession().pipe(mergeMap((session) => {
console.log('So what??');
let token = '';
if (session) {
token = session.getIdToken().getJwtToken();
options = options || {};
options.headers = options.headers || new Headers();
options.headers.append('Authorization', token);
}
return this._http.get(url, options);
}));
}
我是这样称呼这个的 api.
getItemInfo(item) {
return this._apiHttp.get('/assets/data/item.json')
.map(res => {
console.log(res);
return res.json();
})
.subscribe(data => console.log(data),
err => console.log(err),
() => console.log('done'));
}
现在的问题是在这两种情况下都是控制台 prints.and 而不是进行 http 调用。
Found Session
done
我无法理解我在使用 switchmap 的 mergermap 来完成 http 请求时哪里出错了。
错误在getSession()
。您的 AsynFn4session 回调在主题的观察者正在收听之前完成。 (一个主题的观察者只接收在它订阅后发出的值)。这意味着观察者永远不会收到主题发射,因此可观察序列不会继续。我会使用 observable 而不是 subject
getSession(): Observable<any> {
return new Observable(observer => {
AsynFn4session((err, session) => {
observer.next(session);
observer.complete();
});
});
}