Angular教程及其内存Web API是否遵循正确的PUT语义?

时间:2019-05-02 14:52:15

标签: angular rest api

我一直在学习Angular教程,并注意到内存Web API 的使用。除了PUT heroes method中的代码之外,其他所有功能都很酷。

这里是:

private heroesUrl = 'api/heroes';
...

/** PUT: update the hero on the server */
updateHero (hero: Hero): Observable<any> {
  return this.http.put(this.heroesUrl, hero, httpOptions).pipe(
    tap(_ => this.log(`updated hero id=${hero.id}`)),
    catchError(this.handleError<any>('updateHero'))
  );
}

要注意的是,PUT请求是针对this.heroesUrl而非this.heroesUrl/hero.id发出的。从我的理解上,当通过HTTP实现CRUD时,应该对资源URL进行PUT。

我对PUT的理解正确吗?

在上面的代码中它起作用是因为要更新的英雄idhero.id,它是通过PUT发送的hero对象的一部分

对于这个简单的英雄模型,使用本教程的In-memory Web API包自动生成基础API。

如果是,In-memory Web API是否生成正确的PUT语义?

1 个答案:

答案 0 :(得分:0)

根据wikipedia的定义,我会同意你的看法。

this.heroesUrl是指向英雄收藏的链接。此类资源的维基百科定义为:

  

用请求主体中的表示形式替换集合资源的成员资源的所有表示形式,或者如果不存在则创建集合资源。

这意味着在调用this.heroesUrl时,我们希望将一个集合替换为另一个集合。这有点不对,因为他们只会更新一个英雄并通过看身体来获取一个英雄。

最好使用this.heroesUrl/${hero.id} ,在这种情况下,我们正在更新特定资源。维基百科对此的定义是:

  

替换成员资源的所有表示形式,或创建   成员资源(如果不存在)以及   请求正文。

您可以在angular github repository中打开错误报告,他们通常可以很快地更改此类内容/提供推理理由以这种方式进行操作。