我无法弄清楚如何使用Http请求的结果来发出另一个Http请求。
我有一个服务,它从后端API请求和接收JSON Web令牌,如下所示:
@Injectable()
export class JwtAuthorizationService {
constructor(private http: Http) {}
public requestToken(): Observable<string> {
// Set dummy credentials.
let body = this.setBody();
let headers = this.setHeaders();
let token = this.http.post(tokenUrl, body, { headers: headers })
.map(this.extractData)
.catch(this.handleError);
// Return the Observable
return token;
}
private extractData(res: Response): string {
let body = res.text();
return body || "";
}
我现在如何使用requestToken()
(一个Observable)的结果进行另一个API调用,使用JWT进行身份验证,并从中获取结果?或者更简单地说,当一个Http调用依赖于另一个Http调用的结果时,你会怎么做?
答案 0 :(得分:4)
您可以使用flatMap
运算符执行此操作:
this.authorizationService.requestToken().flatMap(token => {
var headers = new Headers();
headers.append('Authorization', `Bearer ${token}`);
return this.http.get('...', { headers }).map(res => res.json());
});
您还可以通过扩展HTTP类使其透明化。在其中,您可以检查令牌的有效性,如果它已过期,请调用requestToken
方法。
有关详细信息,请参阅此问题:
答案 1 :(得分:2)
如果您的网络电话需要使用之前网络电话的结果,则可以使用const combined$ = jwtAuthenticationService.requestToken()
.switchMap(tokenBody => this.http.get('/someurl') );
运营商:
// requestToken
|---------------T---|
// second HTTP request
|------R--|
// combined$
|--------------------------R--|
这是大理石图:
combined$
序列如下:
combined$
将取消订阅while(broj2 == broj1) {
broj2=Math.floor(Math.random() * 10) +1;)
}
while(broj3 == broj2 || broj3 == broj1) {
broj3=Math.floor(Math.random() * 10) +1;)
}
完成