我有兴趣在ASP.NET Core WebAPI中添加对部分更新的支持,在此我仅更新调用者提供的资源上的属性,而保留排除的属性不变。

对于上下文,假设我有一个资源,可以描述如下:

GET /users/1
{
    title: "Mister",
    firstName: "Frederick",
    middleName: "McFeely",
    lastName: "Rodgers"
}

如果我想让消费者将存储在firstName属性中的值从“Frederick”单独更改为“Fred”,我应该能够公开一个支持JSON Merge Patch PATCHContent-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/

10-10 19:08