使用 JSON PATCH 进行部分更新的 API 示例

问题描述 投票:0回答:1

我正在寻找使用 REST API (ASP.NET) 对对象应用部分更新的最佳解决方案

我原本想使用“JSON合并补丁”格式(rfc7396),但我无法使用ASP.NET做到这一点(很难区分被忽略的字段,以及设置为空的字段)

我尝试使用 JSON PATCH 格式的 PATCH 并且它正在工作。

例如。 :

[
    { "op": "replace", "path": "/Name", "value": "patchedValue" },
    { "op": "replace", "path": "/EnumTest", "value": "blo" },
    { "op": "replace", "path": "/SubItem/Name", "value": "patchedValue" }
]

我看到微软支持这种格式(asp.net core json patch),但我不知道这种格式是否经常使用。我不想成为唯一使用它的人...我正在寻找使用这种格式进行部分更新的大公司的 API。你有一些例子吗?

rest patch
1个回答
0
投票

由于我无法区分要设置为 NULL 的属性和忽略的属性,并且我想向使用 API 的人发出一个简单的请求,所以我的解决方法是:

  1. 手动读取请求JSON而不是反序列化它

    person.JsonObject = await Request.Content.ReadJsonAsync();
    
  2. 让我的模型继承这个类

     public class RequestBase
     {
     internal JObject JsonObject { get; set; }
    
     internal bool IsJsonPropertySet(string propertyPath)
     {
         if (JsonObject == null)
             return true; // if null => full update.
    
         return JsonObject.SelectToken(propertyPath) != null;
     }
    

    }

  3. 对于每个属性,手动检查是否在 JSON 中设置并更新值

    if (src.IsJsonPropertySet("validity.startDate"))
       dest.ValidityStartDate = src.Validity.StartDate;
    

我确信有更好的解决方案,但我没有为我的旧 Web API 项目找到它......

© www.soinside.com 2019 - 2024. All rights reserved.