2017-08-15 18 views
0

2つのhttpリクエストを(ASP.NET Core MVC Web APIに)チェーンしようとしました。注文は重要ですので、私は.flatMap()を使ってみました。RxJsチェーンの2つのHTTP呼び出し - ASP.NET Core MVC Web Api

  1. 私は(別のmicroserviceである)、ユーザ方法

    constructor(private dataService: DataService) { } 
    
    getUser(): Observable<User | null> { 
        if (!this.retrieve("IsAuthorized") || (this.retrieve("Email") === "" || this.retrieve("Email") === null)) { 
         return Observable.of(null); 
        } 
    
        return this.getUserByEmail(this.retrieve("Email")) 
         .do((user: User) => { 
          this.setCurrentUser(user); 
         }); 
    } 
    
    public createUser(email: string, familyName: string, givenName: string, phoneNumber: string, gender: string): Observable<User | null> { 
        let createUser = this.dataService.post(this.usersApiUrl, null, { 
         Email: email, FamilyName: familyName, 
         GivenName: givenName, PhoneNumber: phoneNumber, Gender: gender 
        }).map(response => response.json()); 
    
        return createUser.flatMap((res: Response) => { return this.getUser(); }) 
    } 
    
    private setCurrentUser(user: User) { 
        this.currentUser.next(user); 
    } 
    
    private getUserByEmail(email: string): Observable<User> { 
        return this.dataService.get(this.usersApiUrl, email).map(response => response.json()); 
    } 
    

this.currentUserを取得呼び出したいユーザー

  • を作成するには、ReplaySubject<User> = new ReplaySubject<User>(1);

    現在であります動作:POST(ユーザーの作成)は期待通りに動作します。 GET(this.getUser())が呼び出されません。

    P.S:ユーザーの応答を作成することに本当に関心がありません。これは、成功したとしか伝えないためです。

    更新:this.storagelocalStorageある

    private retrieve(key: string): any { 
         var item = this.storage.getItem(key); 
    
         if (item && item !== 'undefined') { 
          return JSON.parse(this.storage.getItem(key)); 
         } 
    
         return null; 
        } 
    

    と私は古典的な方法でこれを購読する:

    this.userService.createUser(this.authService.email, this.authService.familyName, 
        this.authService.givenName, this.authService.phoneNumber, this.authService.gender).subscribe(() => { }); 
    
  • +0

    https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api

    あなたはにそれを変えることができますか?おそらく、あなたは 'this.retreive()'、 'this.currentUser'と' .flatMap() 'を使用する場所を含むすべてのコードを投稿して、デバッグが容易になるようにしたいと思うでしょう。 – CozyAzure

    +0

    @CozyAzure私の質問を更新しました私が言ったように、現時点では、作成したユーザーのhttp呼び出しを起動するだけですが、後でユーザーを取得することはありません。 –

    答えて

    0

    最初の試行は、クライアント側の観点からはRx &でした。

    [HttpPost] 
    public void Post([FromBody]CreateUserRequest request) 
    { 
        _service.Create(request); 
    } 
    

    が空のコンテンツの代わりに、204(コンテンツなし)とその原因ストリーム(RX)の失敗で200を返します:

    問題は、ASP.NET MVCのコアのWeb APIに関連しています。何が動作していないが、

    [HttpPost] 
    public IActionResult Post([FromBody]CreateUserRequest request) 
    { 
        _userService.Create(request); 
        return NoContent(); 
    } 
    
    0

    あなたが行うすべては、私は何もそれに加入していないのでgetUserが発射されていないと思うよりも、createUserメソッドを呼び出している場合。 .subscribe()からgetUserの呼び出しを追加し、これが役立つかどうかを確認してください。

    +0

    これは戻り値の型を変更することを意味します。私はObservable を返し続けたいと思います。その機能の中で、http呼び出しのチェーンを作りたいと思っています。作成して取得してください。これを購読することができます。 –

    +0

    戻り値の型を保持したい場合は、すぐに戻り、 'let obs = this.getUserByEmail ...'、 'obs.subscribe()'や 'return obs;'などの一時変数を使用してください。 –

    +0

    私はこのアプローチを試みました。 –

    関連する問題