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

时间:2016-11-15 17:45:49

标签: rest asp.net-web-api put httpverbs

关于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)

1 个答案:

答案 0 :(得分:0)

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

api/{controller}/{id}

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

api/persons/42

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

public void Put(int id, [FromBody]SomeDto someDto)

...将确保您的DTO标识符(例如42)出现在PUT请求的URI中,这被视为herehere所述的良好做法。

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

if (someDto.Id != id)
{
    return BadRequest("The DTO identifier does not match the identifier in the route.");
}