关于REST和ASP.NET Web API,即使DTO有效负载(例如,JSON)本身指定了标识符,是否有必要将标识符添加到PUT操作方法的路由中?
例如:
public void Put(int id, [FromBody]SomeDto someDto) // someDto has an 'Id' property
ASP.NET Web API模板包含id
参数,我看过很多这方面的例子。
相比之下,是否可以省略id
参数并仍然遵守REST准则?例如:
public void Put([FromBody]SomeDto someDto)
答案 0 :(得分:0)
考虑默认的ASP.NET Web API路由模板:
api/{controller}/{id}
...以及与该模板匹配的路由:
api/persons/42
然后,您的第一个方法签名:
public void Put(int id, [FromBody]SomeDto someDto)
...将确保您的DTO标识符(例如42
)出现在PUT请求的URI中,这被视为here和here所述的良好做法。>
然后在Put
操作方法中,可以考虑检查DTO中指定的标识符是否与路由中指定的标识符匹配。如果它们不同,则返回HTTP状态代码400 Bad Request:
if (someDto.Id != id)
{
return BadRequest("The DTO identifier does not match the identifier in the route.");
}