前言

依据 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" : "alice@wonderland.org"
},
{
"op" : "add" ,
"path" : "/users/-" ,
"value" : {
"name" : "Christine",
"email" : "christine@example.org"
}
}
]

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

JsonPatch in ASP.NET Core web API

JSON Patch With ASP.NET Core

JSON Merge Patch in .NET Core

JSON Merge Patch in ASP.NET Core

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. Issue: JsonPatchDocument should use System.Text.Json in ASP.NET vNext

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 不到的场景, 每年也都要修订, 没有绝对的)

ASP.NET Core – Web API JSON Patch的更多相关文章

  1. 在Mac下创建ASP.NET Core Web API

    在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...

  2. ASP.NET Core Web API 开发-RESTful API实现

    ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...

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

    原文: JSON Patch With ASP.NET Core 作者:.NET Core Tutorials 译文:如何在ASP.NET Core中使用JSON Patch 地址:https://w ...

  4. ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...

  5. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  6. 在ASP.NET Core Web API上使用Swagger提供API文档

    我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...

  7. 在docker中运行ASP.NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

  8. docker中运行ASP.NET Core Web API

    在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...

  9. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

    HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...

  10. 如何在ASP.NET Core Web API测试中使用Postman

    使用Postman进行手动测试 如果您是开发人员,测试人员或管理人员,则在构建和使用应用程序时,有时了解各种API方法可能是一个挑战. 使用带有.NET Core的Postman为您的Web API生 ...

随机推荐

  1. TP5.0学习笔记

    TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文件夹,它叫做模块儿, ...

  2. leetcode 中等(设计):[146, 155, 208, 211, 284, 304, 307, 341, 355, 380]

    目录 146. LRU 缓存 155. 最小栈 208. 实现 Trie (前缀树) 211. 添加与搜索单词 - 数据结构设计 284. 顶端迭代器 304. 二维区域和检索 - 矩阵不可变 307 ...

  3. Django日期字段默认值default=timezone.now

    如果你确实希望默认值是当前日期和时间,Django 提供了一个方便的函数 django.utils.timezone.now 来实现这一目的. 你可以这样调整你的模型,以使用当前日期和时间作为默认值: ...

  4. 基于微信小程序+Springboot校园二手商城系统设计和实现

    \n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 一. 前言介绍: 在当今社会的高速发展过程中,产生的劳动力越来越大,提高人们的生活水平和质 ...

  5. 题解:P10677 『STA - R6』inkar-usi

    背景 把人家鸽了,感觉废了. 分析 这道题刚看到题目的时候很多人会想爆搜,但是因为 \(10^3\) 的数据范围,所以应该去想一想是不是有什么性质. 我们稍微想一想就会发现,题目上提到了可以重复走,那 ...

  6. SUM_ACM-Codeforces Round 941 (Div. 2)

    A Card Exchange https://codeforces.com/contest/1966/problem/A 思路:找规律,如果b>a,输出a,如果a中有大于等于b个数,输出b-1 ...

  7. vue项目坑记录:vue项目运行卡在百分之几几几

    今天晚上打着游戏,同事突然叫我拉项目下来运行,我打完就去拉代码了,结果vue项目运行卡在66%不动了,我也是百度一下分享别人怎么解决的文章给他,继续我的游戏! 结果呢? 游戏结束后,我拉代码,还是这个 ...

  8. .NET跨平台UI框架Avalonia 11.1重磅发布

    本篇为译文 原文地址 https://avaloniaui.net/blog/avalonia-11-1-a-quantum-leap-in-cross-platform-ui-development ...

  9. Go 使用 Cobra 构建 CLI 程序

    使用 cobra-cli 搭建手脚架 # 安装 cobra-cli go install github.com/spf13/cobra-cli@latest # 创建一个应用 mkdir myapp ...

  10. 强化学习:reward function shaping —— 着陆器(lander)游戏中的奖励函数的设计

    lander 游戏是强化学习问题中常使用的一个游戏场景,不同人对该问题都设置了不同的reward function,一直也没有对该游戏的各种reward function的设计做一个记录,正好看视频看 ...