ASP.NET Core – Web API JSON Patch

前言

依據 Restful 的方式, 修改 resource 要用 PUT, 然後把完整的 resource 發出去, resource 的所有信息都將被更新.

但很多時候我們希望只做局部更新, 而且希望只提供局部的 resource info.

比如有個 person resource

class Person {
    name: string;
    age: number;
}

如果只想修改 age 的話, 那 body 就是 { age : 11 }, 夠了.

JSON Path & JSON Merge Path

這種情況下, Restful 對應的方式就是使用 JSON Patch 和 JSON Merge Path

JSON Patch 的 method 是 PATCH, content-type 是 application/json-patch+json

JSON Merge Path 的 method 是 PATCH, content-type 是 application/merge-patch+json

它們比較大的區別在 body

JSON Merge Path 和我們上面期望的比較類似, 就只發想要修改的內容, 其餘的就省略掉. 

但有一點要留意的是 { age: null }, 這個表達的意思是, delete 掉 age 這個 property, 而不是把 age set value to null.

要把 age set to null, 就一定要用 PUT 或者 JSON Patch

JSON Patch 的 body 是一堆修改的表達格式.

大概長這樣:

[
    {
        "op" : "replace" ,
        "path" : "/users/0/email" ,
        "value" : "[email protected]"
    },
    {
        "op" : "add" ,
        "path" : "/users/-" ,
        "value" : {
            "name" : "Christine",
            "email" : "[email protected]"
        }
    }
]

op 是 operation, 有 add, remove, replace, move, copy

path 就是定位那個 property 要修改

value 就 new value 咯.

所以 JSON Patch 能做的比 JSON Merge Patch 多, 但是也相對複雜一些.

詳細的內容看這幾篇:

JSON Patch and JSON Merge Patch

如何在ASP.NET Core中使用JSON Patch

 

Should I use it?

JSON Patch 其實對前端來說是比較麻煩的, JSON Merge Patch 的 null 概念也容易被坑.

所以我個人覺得 Restful 的東西, 大多時候聽聽就好, 不要死死跟它.

也可以看看 WEB開發中,使用JSON-RPC好,還是RESTful API好?大寬寬的回答

 

JSON Patch in ASP.NET Core

首先 ASP.NET Core 沒有 build-in JSON Merge Patch.

它目前只有 build-in JSON Patch 但還需要配合 NewtonsoftJson.

step by step 看這篇就可以了: JsonPatch in ASP.NET Core web API

前端就是傳 operation 

 

 後端就是接受, 然後 apply to resource

 

具體 resource 是一個 DTO, 還是一個 entity, 自由發揮, 後續的 validation 什麼的也自由發揮, 它就只是封裝了把 operation apply to resource, 讓 resource 變化而已.

所以有些人的做法是, 

從數據庫拿資料放入 DTO

在把 JSON Patch apply to DTO (覆蓋原本的值)

這樣 DTO 就完整了, 然後可以拿去做驗證什麼的

再然後把 DTO to Entity 更新數據.

 

到底這個做法對不對,好不好, 完全是看你要怎麼管理. 

抽象來看, JSON Patch 的主要職責就是表達如果修改資源, 它就是一個表達而已, 理解的人要做什麼那個是理解的人要去實現的部分. 不要被套死死.

另外, 表達只是一種手法, 我們完全可以用其它的表達方式, 也不一定非要用 JSON Patch. 用它只是因爲它有個規範, 有搭配一些便利的工具 (比如上面這個 apply to 的功能)

如果我們的場景比較特殊, 我們完全可以自己搞一套自己的規則 (要知道所有規則都是一點點 build 起來的, 法律也有 cover 不到的場景, 每年也都要修訂, 沒有絕對的)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章