在REST API的PUT请求中,指定DTO ID是应该放在请求体里还是URI中?

7

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

你可以写代码,但这应该是一个“POST”,而不是“PUT”。 - Divyang Desai
ID是内部生成的键还是自然键?如果您使用PUT创建新项目,您如何知道ID是什么? - Jasen
1
我想使用put方法进行更新。我真的在尝试使用大家都在做的事情,只是为了使用流行的约定,并使我的api与众不同。Id是someDto的一部分,这很简单,没有什么花哨的东西,只是一个带有id属性的dto。 - kwiri
1
请参考Put vs Post中带有id的示例。 - Jasen
不需要两次发送“id”。保持简单。 - dieter
显示剩余3条评论
1个回答

5
考虑默认的ASP.NET Web API路由模板:
api/{controller}/{id}

...和匹配该模板的路由:

api/persons/42

接下来,是你的第一个方法签名:

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

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接