我一直在学习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的理解正确吗?
在上面的代码中它起作用是因为要更新的英雄id
是hero.id
,它是通过PUT发送的hero
对象的一部分
对于这个简单的英雄模型,使用本教程的In-memory Web API包自动生成基础API。
如果是,In-memory Web API
是否生成正确的PUT语义?
答案 0 :(得分:0)
根据wikipedia的定义,我会同意你的看法。
this.heroesUrl
是指向英雄收藏的链接。此类资源的维基百科定义为:
用请求主体中的表示形式替换集合资源的成员资源的所有表示形式,或者如果不存在则创建集合资源。
这意味着在调用this.heroesUrl
时,我们希望将一个集合替换为另一个集合。这有点不对,因为他们只会更新一个英雄并通过看身体来获取一个英雄。
最好使用this.heroesUrl/${hero.id}
,在这种情况下,我们正在更新特定资源。维基百科对此的定义是:
替换成员资源的所有表示形式,或创建 成员资源(如果不存在)以及 请求正文。
您可以在angular github repository中打开错误报告,他们通常可以很快地更改此类内容/提供推理理由以这种方式进行操作。