You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Angular NgRx Effect中获取响应头的值

在NgRx Effect中获取API响应头并合并到Payload中

要获取API响应头中的分页信息并添加到NgRx Effect的payload里,需要分三步调整代码:修改API服务以返回完整响应、在Effect中提取头信息并组装payload、更新对应Action的类型定义。

1. 修改API服务,返回完整HTTP响应

Angular HttpClient默认仅返回响应体,要获取响应头需配置observe: 'response',这样会返回包含头信息的HttpResponse对象:

filterCandidate(candidateFilter: candidateFilter): Observable<HttpResponse<Result<Candidate>>> {
  let params = new HttpParams(); // 初始化参数对象

  if (candidateFilter) {
    if (candidateFilter.keyword) {
      params = params.append('keyword', candidateFilter.keyword);
    }
  }
 
  params = params.append('pageNumber', candidateFilter.pageNumber.toString())
    .append('pageSize', candidateFilter.pageSize.toString())
    .append('sortBy', candidateFilter.sortBy)
    .append('sortByDirection', candidateFilter.sortDirection);

  // 关键配置:observe: 'response' 用于获取包含头信息的完整响应
  return this.httpClient.get<Result<Candidate>>(`${this.appConfig.apiUrl}/candidate/filter`, { 
    params,
    observe: 'response' 
  });
}

2. 修改NgRx Effect,提取响应头并组装Payload

在Effect中处理返回的HttpResponse,提取头中的分页信息,再和响应体一起传给成功Action:

filterCandidates$ = createEffect(() => 
  this.actions$.pipe(
    ofType(candidateActions.filterCandidate),
    switchMap((payload) => 
      this.candidateApiService.filterCandidate(payload.candidateFilters, payload.options).pipe(
        tap(response => console.log('完整响应(含头):', response)),
        map((response) => {
          // 从响应头提取分页信息(示例字段为X-Total-Count、X-Total-Pages,请根据后端实际字段调整)
          const totalCount = response.headers.get('X-Total-Count');
          const totalPages = response.headers.get('X-Total-Pages');

          // 组装包含结果和分页信息的payload
          return candidateActions.filterCandidateSuccess({ 
            result: response.body,
            pagination: {
              totalCount: totalCount ? parseInt(totalCount, 10) : 0,
              totalPages: totalPages ? parseInt(totalPages, 10) : 0,
              currentPage: payload.candidateFilters.pageNumber,
              pageSize: payload.candidateFilters.pageSize
            }
          });
        }),
        catchError((error: Error) => of(candidateActions.filterCandidateFailed({ error })))
      )
    )
  )
);

3. 调整Action类型定义

更新成功Action的payload类型,使其同时支持响应体和分页信息:

// 定义分页信息类型
export interface PaginationInfo {
  totalCount: number;
  totalPages: number;
  currentPage: number;
  pageSize: number;
}

// 更新成功Action的定义
export const filterCandidateSuccess = createAction(
  '[Candidate] Filter Candidate Success',
  props<{ result: Result<Candidate>, pagination: PaginationInfo }>()
);

注意事项

  • CORS配置要求:如果后端返回的是自定义响应头(如示例中的X-Total-Count),需要在后端CORS配置中添加Access-Control-Expose-Headers字段,将这些头暴露给前端,否则headers.get()会返回null。例如:
    Access-Control-Expose-Headers: X-Total-Count,X-Total-Pages
    

内容的提问来源于stack exchange,提问作者SRAMPI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:50:35