使用RxJS从Angular 7服务中提取数据以订阅DotNetCore WebAPI

时间:2019-03-05 16:19:38

标签: rxjs angular7

我是RxJ的新手。

我们有一个DotNetCore api,它返回一个响应模型,并带有通用数据:

public class SingleModelResponse<T> : ISingleModelResponse<T>
{
    public Boolean DidError { get; set; }
    public String ErrorMessage { get; set; }

    public T Data { get; set; }
}

控制器以如下方式返回它:

    [HttpGet]
    [Route("{organisationId}/stats")]
    public async Task<IActionResult> GetStats(int organisationId)
    {
        var response = new SingleModelResponse<OrganisationStatsDTO>();
        try
        {
            var result =  await _service.GetStatsAsync(organisationId);
            response.Data = result;
        }
        catch (Exception ex)
        {
            response.DidError = true;
            response.ErrorMessage = ex.Message;
        }
        return response.ToHttpResponse();
    }

我的角度服务已设置为接收OrganistionStats:

   loadStats(organisationId: number): Observable<OrganisationStats> {
     const url = '/api/Organisation/' + organisationId + '/stats';
     return this.http.get<OrganisationStats>(url).pipe(
       map(response => response),
       tap(data => console.log('Stats: ' + JSON.stringify(data))),
       catchError(this.handleError)
     );
   }

麻烦的是返回的不是OrganisationStats,而是SingleModelResponse。我在解决如何更改服务以从data属性中提取OrganisationStats时遇到麻烦。

  loadStats(organisationId: number): Observable<OrganisationStats> {
    const url = '/api/Organisation/' + organisationId + '/stats';

    return this.http.get<SingleModelResponse>(url).pipe(
      map(response => response),
      tap(data => console.log('Stats: ' + JSON.stringify(data))),
      catchError(this.handleError)
    );
  }

1 个答案:

答案 0 :(得分:0)

好吧,事实证明这很简单。在服务中,我用http.get(url)替换了get(url),警告消失了。

loadStats(organisationId: number): Observable<OrganisationStats> {
   const url = environment.api_root + '/api/Organisation/' + organisationId + '/stats';

   return this.http.get<any>(url).pipe(
      map(response => response.data),
      tap(data => console.log('Stats: ' + JSON.stringify(data))),
      catchError(this.handleError)
   );

}