【问题标题】:How can I get data from all pages of my REST API?如何从我的 REST API 的所有页面获取数据?
【发布时间】:2019-12-15 15:20:37
【问题描述】:

我在我的应用程序中实现了一个搜索引擎,我需要获取我拥有的资源的所有数据,例如用户的所有帖子。

我的 api 例如返回以下内容:

{
    "count": 2,
    "next": "http://127.0.0.1:8000/resource/?page=2",
    "previous": null,
    "results": [
        {
            "resource_data": "data"
        }
    ]
}

我想在我的服务中创建一个方法,该方法返回一个带有包含所有页面数据的数组的承诺。

我对 typescript 或 javascript 的了解有限,我找不到优雅的方法。

解决办法:

使用选定的答案作为我开发的最佳答案,该代码将用于我的服务

    getAllMDPosts(): Observable<MDPost[]> {
        return this.getRecursivelyMDPosts(`${environment.apiUrl}/mdposts/`);
    }

    private getRecursivelyMDPosts(url: string, results?: MDPost[]): Observable<MDPost[]> {
        if (results === undefined) {
            results = [];
        }
        return this.http.get(url).pipe(
            switchMap(response => {
                    if (response.next) {
                        return this.getRecursivelyMDPosts(response.next, results.concat(response.results));
                    } else {
                        return of(results.concat(response.results));
                    }
            })
        );
    }

我不是三元运算符的粉丝,我通常会在条件语句中添加更多代码,并且我必须修改三元运算符。

【问题讨论】:

标签: angular typescript django-rest-framework


【解决方案1】:

您想将地图切换到下一页,直到没有更多页面为止

getData(url: string, results?: dataType[]): Observable<dataType[]> {
   return this.http.get(url).pipe(
     switchMap(response) {
       return response.next ?
         this.getData(response.next, [...results, ...response.results]) : // Get the next page
         of([...results, ...response.results]) // Just return the results
     }
   )
}

第一次打电话没有结果

this.yourService.getData('http://127.0.0.1:8000/resource/').subscribe(finalResults => {
  // do stuff with results
});

【讨论】:

  • 非常好的答案,正是我们需要的。我进行了一些修改以使其工作并更好地适应它。我把我的代码放在问题中。
猜你喜欢
  • 2020-02-09
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2015-06-03
  • 2017-03-11
  • 2016-02-25
  • 2020-11-18
  • 1970-01-01
相关资源
最近更新 更多