httpService を記述しようとしています。認証トークンを含む Cookie が存在するかどうかを確認するポスト メソッドが必要です。存在する場合は、認証ヘッダーを追加してポスト リクエストを行う必要があります。
ただし、Cookie が存在しない場合は、トークンを含むローカル json ファイルを読み込み、それを使用して Cookie を作成し、認証ヘッダーを追加して投稿要求を行う必要があります。
私が抱えている問題は、Cookie が存在しない場合、オブザーバブルを別のオブザーバブルを待機させる必要があることです。解決策はswitchMapを使用することだと思っていましたが、http.postリクエストを初期化するために必要な.subscribeではうまくいきません。
private makePostRequest(address: string, payload: any, callback: any): Observable<any> {
return this.http.post(address, payload, { headers: this.headers })
.map(callback)
.catch(( error: any ) => this.handleError(error));
}
public post(address: string, payload: any, callback: any): Observable<any> {
if (this.hasOAuth2()) {
this.appendHeader(this.cookieService.get('oauth2'));
return this.makePostRequest(address, payload, callback);
} else if (this.isLocalhost()) {
return this.setAuthCookie()
.switchMap(() => this.makePostRequest(address, payload, callback));
} else {
return this.handleError('Could not locate oauth2 cookie');
}
}
private setAuthCookie(): Observable<any> {
return this.http.get('./json/token.json')
.map((res: Response) => {
let oauth2: any = res.json();
this.cookieService.set('oauth2', oauth2.access_token, oauth2.expiration);
this.appendHeader(oauth2.access_token);
})
.catch((error: any) => {
console.log('No dev token was found', error);
return Observable.throw(error);
});
}
更新: これが奇妙になるのは、多かれ少なかれ正確なゲーム コードが get 要求で正しく動作することです。
private makeGetRequest(address: string, callback: any): Observable<any> {
return this.http.get(address, { headers: this.headers })
.map(callback)
.catch(( error: any ) => this.handleError(error));
}
public get(address: string, callback: any): Observable<any> {
if (this.hasOAuth2()) {
this.appendHeader(this.cookieService.get('oauth2'));
return this.makeGetRequest(address, callback);
} else if (this.isLocalhost()) {
return this.setAuthCookie()
.switchMap(() => this.makeGetRequest(address, callback));
} else {
return this.handleError('Could not locate oauth2 cookie');
}
}
解決策: httpService.post オブザーバブルにサブスクライブしていなかったので、初期化されていませんでした。