【问题标题】:How to use RxJS in Angular2 to interact with HATEOAS API?如何在 Angular2 中使用 RxJS 与 HATEOAS API 交互?
【发布时间】:2019-06-14 14:03:26
【问题描述】:

我有一个实现 HATEOAS 的 (Django) API,因此通常外键对象作为 URL 到达其他 API 端点。以下是来自http://localhost:8000/brew-monitor/api/fermentations/1/ 的结果,是一个带有关联数据集对象的发酵对象:

{
    "id": 1,
    "name": "My Beer",
    "datasets": [
        "http://localhost:8000/brew-monitor/api/datasets/1/",
        "http://localhost:8000/brew-monitor/api/datasets/2/"
    ]
}

我需要编写一个服务来获取上述对象,然后遍历datasets URL 并获取那些(我知道,也许它可以更有效,但我正在自学 HATEOAS)。

Dataset 对象如下所示:

{
    "id": 1,
    "unit": "DEGF",
    "variable_measured": "T",
    "fermentation": "http://localhost:8000/brew-monitor/api/fermentations/1/",
    "logging_device": "http://localhost:8000/brew-monitor/api/devices/1/",
    "controls": [],
    "active": true,
    "datapoints": [
        "http://localhost:8000/brew-monitor/api/datapoints/1/",
        "http://localhost:8000/brew-monitor/api/datapoints/2/",
        "http://localhost:8000/brew-monitor/api/datapoints/3/"
    ]
}

所以我希望我的服务的最终结果如下所示:

{
    "id": 1,
    "name": "My Beer",
    "datasets": [
        {
            "id": 1,
            "unit": "DEGF",
            "variable_measured": "T",
            "fermentation": "http://localhost:8000/brew-monitor/api/fermentations/1/",
            "logging_device": "http://localhost:8000/brew-monitor/api/devices/1/",
            "controls": [],
            "active": true,
            "datapoints": [
                "http://localhost:8000/brew-monitor/api/datapoints/1/",
                "http://localhost:8000/brew-monitor/api/datapoints/2/",
                "http://localhost:8000/brew-monitor/api/datapoints/3/"
            ]
        },
        {
            "id": 2,
            "unit": "UNITLESS",
            "variable_measured": "SG",
            "fermentation": "http://localhost:8000/brew-monitor/api/fermentations/1/",
            "logging_device": "http://localhost:8000/brew-monitor/api/devices/1/",
            "controls": [],
            "active": true,
            "datapoints": [
                "http://localhost:8000/brew-monitor/api/datapoints/4/",
                "http://localhost:8000/brew-monitor/api/datapoints/5/",
                "http://localhost:8000/brew-monitor/api/datapoints/6/"
            ]
        }
    ]
}

我只是知道 RxJS 可以做到这一点。怎么样?

编辑:我有一个使用嵌套订阅的解决方案,但我认为您应该避免这种情况是常识。所以请不要嵌套订阅。

【问题讨论】:

    标签: rxjs angular2-services hateoas


    【解决方案1】:

    我会做这样的事情

    const source$ = of({
        "id": 1,
        "name": "My Beer",
        "datasets": [
            "http://localhost:8000/brew-monitor/api/datasets/1/",
            "http://localhost:8000/brew-monitor/api/datasets/2/"
        ]
    });
    const data$ = source$.pipe(
      switchMap(source => this.getDatasets(source))
    );
    
    data$.subscribe(x => console.log(x));
    
    function getDatasets(source) {
      return forkJoin(source.datasets.map(endpoint => fakeHttpRequest(endpoint))).pipe(
        map(results => ({...source, datasets: results}))
      );
    }
    
    function fakeHttpRequest(endpoint) {
      return of({
        test: '123'
      });
    }
    

    RXJS 很棒。

    【讨论】:

    • 这很棒!我什至能够添加第二层嵌套 api 调用,但实际上并不一定建议这样做。我对 HATEOAS 的感觉很复杂。
    猜你喜欢
    • 2017-07-18
    • 2017-04-21
    • 2020-10-05
    • 2012-05-12
    • 2020-10-08
    • 2015-09-22
    • 2017-07-24
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多