如何检测远程REST服务中可用对象的数量
如何获取远程REST服务中可用对象的总数并批量获取所有对象
你现在的核心问题是缺少从REST服务获取Person对象总数的环节,没法生成对应的ID列表来批量请求。根据常见的REST API设计,我给你两种最实用的解决方案:
场景1:API提供单独的总数查询接口
很多后端会专门提供一个接口返回资源总数,比如GET https://myapi/persons/count直接返回数字。这种情况下,我们可以先拿总数,再生成批量请求:
url = "https://myapi/"; getPerson(personsId: number) { return this.http.get<Person>(`${this.url}${personsId}`, { headers: this.headers }); } // 新增获取总数的方法 getPersonsCount(): Observable<number> { return this.http.get<number>(`${this.url}persons/count`, { headers: this.headers }); } getAllPersons(): Observable<Person[]> { return this.getPersonsCount().pipe( switchMap(numberOfPersons => { // 生成从1到总数的ID列表,创建请求数组 const personRequests = [...Array(numberOfPersons).keys()].map(i => this.getPerson(i + 1) ); return forkJoin(personRequests); }), share() ); }
这里用switchMap串联异步操作:先获取总数,再用总数生成批量请求,完美解决numberOfPersons的赋值问题。
场景2:API在分页接口中返回总数
如果没有单独的总数接口,但分页查询的响应里包含总数(比如GET https://myapi/persons?page=1&size=1返回{ total: 100, data: [Person] }),可以先请求一页数据拿到总数:
// 定义分页响应的结构 interface PersonPageResponse { total: number; data: Person[]; } getPersonsPage(page: number, size: number): Observable<PersonPageResponse> { return this.http.get<PersonPageResponse>( `${this.url}persons?page=${page}&size=${size}`, { headers: this.headers } ); } getAllPersons(): Observable<Person[]> { // 先请求第一页拿到总数 return this.getPersonsPage(1, 1).pipe( switchMap(pageResponse => { const numberOfPersons = pageResponse.total; const personRequests = [...Array(numberOfPersons).keys()].map(i => this.getPerson(i + 1) ); return forkJoin(personRequests); }), share() ); }
关键注意事项
- 确保API的ID是连续从1开始的,如果存在删除导致ID断号的情况,按ID循环请求会出现404错误,这种情况建议直接用批量获取接口(比如
GET https://myapi/persons返回所有Person列表),比单个请求更高效。 forkJoin会等待所有请求完成才返回结果,只要有一个请求失败,整个流就会报错。可以给每个getPerson加上错误处理,避免整个批量请求失败:const personRequests = [...Array(numberOfPersons).keys()].map(i => this.getPerson(i + 1).pipe( catchError(err => { console.error(`获取ID为${i+1}的Person失败`, err); return of(null); // 返回默认值或空对象,保证批量请求继续 }) ) );
内容的提问来源于stack exchange,提问作者user11952136




