在正文或 URI 中指定 REST API PUT 请求的 DTO ID?

kwi*_*iri 8 rest put http-verbs asp.net-web-api

对于 REST 和 ASP.NET Web API,即使 DTO 负载(例如 JSON)本身指定了标识符,是否也需要将标识符添加到 PUT 操作方法的路由中?

例如:

public void Put(int id, [FromBody]SomeDto someDto) // someDto has an 'Id' property
Run Code Online (Sandbox Code Playgroud)

ASP.NET Web API 模板包含该id参数,我见过很多这样的例子。

相比之下,是否可以省略该id参数并仍然遵守 REST 准则?例如:

public void Put([FromBody]SomeDto someDto)
Run Code Online (Sandbox Code Playgroud)

Dav*_*dRR 6

考虑默认的 ASP.NET Web API 路由模板:

api/{controller}/{id}
Run Code Online (Sandbox Code Playgroud)

...以及与该模板匹配的路线:

api/persons/42
Run Code Online (Sandbox Code Playgroud)

然后,你的第一个方法签名:

api/{controller}/{id}
Run Code Online (Sandbox Code Playgroud)

...将确保您的 DTO 标识符(例如42)出现在 PUT 请求的 URI 中,这被认为是良好实践,如此处此处所述

在您的Put操作方法中,您可以考虑检查 DTO 中指定的标识符是否与路由中指定的标识符匹配。如果它们不同,则返回 HTTP 状态代码400 Bad Request

api/persons/42
Run Code Online (Sandbox Code Playgroud)