我有兴趣在ASP.NET Core WebAPI中添加对部分更新的支持,在此我仅更新调用者提供的资源上的属性,而保留排除的属性不变。
对于上下文,假设我有一个资源,可以描述如下:
GET /users/1
{
title: "Mister",
firstName: "Frederick",
middleName: "McFeely",
lastName: "Rodgers"
}
如果我想让消费者将存储在
firstName
属性中的值从“Frederick”单独更改为“Fred”,我应该能够公开一个支持JSON Merge Patch PATCH
的Content-Type
端点,如下所示:PATCH /users/1
Content-Type: application/merge-patch+json
{
firstName: "Fred"
}
但是,我不容易知道
firstName
是唯一要更新的属性。例如,如果我要制作一个接受PATCH
动词的 Controller ,则可以像这样将其脚手架:[Route("users")]
public class UsersController : Controller {
[HttpPatch("{userId:int}")]
public User Patch([FromRoute] int userId, [FromBody] User user) {
// How do I know which properties were set on User at this point?
}
}
public class User {
public String Title { get; set; }
public String FirstName { get; set; }
public String MiddleName { get; set; }
public String LastName { get; set; }
}
但是我看不到如何在将JSON对象定义为
User
并传递给我的 Controller 之前提取在JSON对象上定义的键的属性。我不能假设null
的值表示排除了某个属性,因为调用者可以将可选属性显式设置为null。编辑
我知道Microsoft.AspNetCore.JsonPatch库。不幸的是,这希望调用者使用“[变更描述]”来定义RFC 5789,如RFC 7396中所述,我发现它不直观且冗长。我指的是ojit_a中定义的“JSON合并补丁”。
最佳答案
我找到了一个有效的库:https://github.com/Morcatko/Morcatko.AspNetCore.JsonMergePatch
[HttpPatch]
[Consumes(JsonMergePatchDocument.ContentType)]
public void Patch([FromBody] JsonMergePatchDocument<Model> patch)
{
...
patch.ApplyTo(backendModel);
...
}
或使用
patch.JsonPatchDocument.Operations
手动遍历修补程序请求字段。关于c# - 在ASP.NET Core Web API中实现JSON合并补丁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46210063/