gpt4 book ai didi

asp.net-mvc-3 - Web API PUT/POST 中的部分实体更新

转载 作者:行者123 更新时间:2023-12-03 20:28:49 26 4
gpt4 key购买 nike

假设您有一个存储库方法来更新文档:

public Document UpdateDocument(Document document)
{
Document serverDocument = _db.Documents.Find(document.Id);
serverDocument.Title = document.Title;
serverDocument.Content = document.Content;
_db.SaveChanges();
return serverDocument;
}

在这种情况下,实体有两个属性。更新 Document 时,JSON 请求中需要这两个属性,因此请求 PUT /api/folder有一个 body
{
"documentId" = "1",
"title" = "Updated Title"
}

将返回错误,因为未提供“内容”。我这样做的原因是,即使对于可为空的属性和用户不更新的属性,强制客户端在请求中指定这些字段以避免用空值服务器端覆盖未指定的字段似乎更安全。

这导致我始终要求 PUT 和 POST 请求中的每个可更新属性,即使这意味着为这些属性指定 null。

这很酷,还是有一种我还没有了解的模式/实践可能通过仅通过网络发送所需的内容来促进部分更新?

最佳答案

API 设计的最佳实践是使用 HTTP PATCH 进行部分更新。
事实上,像您这样的用例正是 IETF 最初引入它的原因。

RFC 5789非常精确地定义它:

PATCH is used to apply partial modifications to a resource.

A new method is necessary to improve interoperability and prevent
errors. The PUT method is already defined to overwrite a resource
with a complete new body, and cannot be reused to do partial changes. Otherwise, proxies and caches, and even clients and servers, may get
confused as to the result of the operation. POST is already used but without broad interoperability (for one, there is no standard way to
discover patch format support).



马克诺丁汉写了一个 好文章关于PATCH在API设计中的使用- http://www.mnot.net/blog/2012/09/05/patch

在你的情况下,那将是:
  [AcceptVerbs("PATCH")]
public Document PatchDocument(Document document)
{
Document serverDocument = _db.Documents.Find(document.Id);
serverDocument.Title = document.Title;
serverDocument.Content = document.Content;
_db.SaveChanges();
return serverDocument;
}

关于asp.net-mvc-3 - Web API PUT/POST 中的部分实体更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16137766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com