【发布时间】:2018-02-22 21:42:09
【问题描述】:
我有兴趣在我的 ASP.NET Core WebAPI 中添加对部分更新的支持,我只更新调用者提供的资源的属性,而排除的属性保持不变。
对于上下文,假设我有一个可以描述如下的资源:
GET /users/1
{
title: "Mister",
firstName: "Frederick",
middleName: "McFeely",
lastName: "Rodgers"
}
如果我想允许消费者将存储在firstName 属性中的值从“Frederick”单独更改为“Fred”,我应该能够公开一个支持JSON Merge Patch@987654328 的PATCH 端点@,就像这样:
PATCH /users/1
Content-Type: application/merge-patch+json
{
firstName: "Fred"
}
但是,我认为没有简单的方法可以知道 firstName 是唯一正在更新的属性。例如,如果我要创建一个接受PATCH 动词的控制器,它可以像这样搭建:
[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 水合并传递给我的控制器。我不能假设 null 的值意味着一个属性被排除在外,因为调用者可能明确地将一个可选属性设置为 null。
编辑
我知道Microsoft.AspNetCore.JsonPatch 库。不幸的是,这期望调用者使用“[description of changes]”来定义PATCH,如RFC 5789 中所述,我觉得这既不直观又冗长。我指的是RFC 7396中定义的“JSON Merge Patch”。
【问题讨论】:
标签: c# asp.net-mvc asp.net-web-api asp.net-core asp.net-core-webapi