.NET中优雅使用Patch: JsonPatch
引言
在现代 Web API 开发中,我们经常需要对资源进行部分更新(Partial Update)。传统的 PUT 请求会要求发送整个对象,而 PATCH 请求可以仅发送需要更新的字段。ASP.NET Core 提供了 JsonPatchDocument<T> 来简化这一操作。
什么是 JsonPatch?
JsonPatch(基于 RFC 6902)是一种 JSON 格式的补丁文档,允许客户端声明式地修改 JSON 资源。JsonPatch 提供了以下操作:
add:添加一个新值
remove:删除一个字段
replace:替换一个字段的值
move:移动一个值
copy:复制一个值
test:测试一个值是否符合预期
在 ASP.NET Core Web API 中使用 JsonPatch
安装依赖
JsonPatch 已内置于 Microsoft.AspNetCore.Mvc.NewtonsoftJson,你需要确保你的项目引用了该包:
builder.Services.AddControllers().AddNewtonsoftJson();
创建 API 控制器
假设我们有一个 Product 类:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
然后,创建 ProductsController 处理 PATCH 请求:
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private static List<Product> _products = new()
{
new Product { Id = 1, Name = "Laptop", Price = 1200 },
new Product { Id = 2, Name = "Mouse", Price = 25 }
};
[HttpPatch("{id}")]
public IActionResult Patch(int id, [FromBody] JsonPatchDocument<Product> patchDoc)
{
var product = _products.FirstOrDefault(p => p.Id == id);
if (product == null)
{
return NotFound();
}
patchDoc.ApplyTo(product, ModelState);
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return Ok(product);
}
}
发送 JsonPatch 请求
客户端可以发送如下 PATCH 请求:
[
{ "op": "replace", "path": "/price", "value": 999.99 }
]
示例 cURL 请求:
curl -X PATCH "http://localhost:5000/api/products/1" \
-H "Content-Type: application/json" \
-d '[{"op": "replace", "path": "/price", "value": 999.99}]'
处理 JsonPatch 可能遇到的问题
确保 JSON 格式正确
JsonPatch 语法容易出错,比如路径格式不正确或缺少 op。建议使用 Postman 或 cURL 进行调试。
处理 ModelState 错误
如果 patchDoc.ApplyTo(product, ModelState); 返回错误,应该返回 BadRequest(ModelState) 并提供详细的错误信息。
结论
JsonPatch 提供了一种优雅的方式来进行部分更新,避免了 PUT 需要传输整个对象的冗余。合理使用 JsonPatch,可以提高 API 的灵活性和效率。
.NET中优雅使用Patch: JsonPatch的更多相关文章
- 如何在ASP.NET Core中使用JSON Patch
原文: JSON Patch With ASP.NET Core 作者:.NET Core Tutorials 译文:如何在ASP.NET Core中使用JSON Patch 地址:https://w ...
- 如何在NodeJS项目中优雅的使用ES6
如何在NodeJS项目中优雅的使用ES6 NodeJs最近的版本都开始支持ES6(ES2015)的新特性了,设置已经支持了async/await这样的更高级的特性.只是在使用的时候需要在node后面加 ...
- 如何在MyBatis中优雅的使用枚举
问题 在编码过程中,经常会遇到用某个数值来表示某种状态.类型或者阶段的情况,比如有这样一个枚举: public enum ComputerState { OPEN(10), //开启 CLOSE( ...
- 如何在 Swoole 中优雅的实现 MySQL 连接池
如何在 Swoole 中优雅的实现 MySQL 连接池 一.为什么需要连接池 ? 数据库连接池指的是程序和数据库之间保持一定数量的连接不断开, 并且各个请求的连接可以相互复用, 减少重复连接数据库带来 ...
- 如何在Vue中优雅的使用防抖节流
1. 什么是防抖节流 防抖:防止重复点击触发事件 首先啥是抖? 抖就是一哆嗦!原本点一下,现在点了3下!不知道老铁脑子是不是很有画面感!哈哈哈哈哈哈 典型应用就是防止用户多次重复点击请求数据. 代码实 ...
- 这样也行,在lambda表达式中优雅的处理checked exception
目录 简介 lambda表达式中的checked exception lambda中的unchecked exception 对lambda的最终改造 总结 简介 最近发现很多小伙伴还不知道如何在la ...
- 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON
项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...
- Oracle EBS-SQL (SYS-13):查询DBA在系统中的打Patch的信息.SQL
查询DBA在系统中的打补丁信息 1. select * from ad_patch_drivers /*查看已经打了哪些Patch*/ 2. select * from ad_pat ...
- 在vue-cli3中优雅的使用 icon
首先我们得有图标 这里我们从网上下载svg文件或者UI给你导出svg文件 我们在src 文件下新建一个放置svg 文件 的文件夹 @/src/icons.将所有 icon 放在这个文件夹下. 创建 i ...
- 如何在自定义Filter中优雅的实现静态资源放行
在javaweb开发中,过滤器Filter比较常用于类似登录的拦截等场景.但是,当过滤器的配置不当时就会把所有的请求都拦截,静态资源也会被拦截掉,导致静态页面加载不出来. 一般的解决方 ...
随机推荐
- Java开发
总结java开发中知识点和问题点 基础: 常用加解密算法: [md5] import java.security.MessageDigest; public static final String e ...
- 关于PageHiOffice插件在win10登录桌面前提示的解决
win10笔记本开机,在未登录桌面时,总是有PageHiOffice插件已过期的提示. 使用process monitor 的Enable Boot Logging功能进行监视,重启后,再次打开pro ...
- 体验 DORIS 安装
1.概述 doris 是 百度提供一个MPP架构的分析性数据库. 下面介绍一下如何安装doris . 2.下载 我用的是centos 7.5 的虚拟器. https://doris.apache.or ...
- 使用arcpy向server端发布服务
import arcpy import os # Set output file names outdir = r"D:" service = "MapImageShar ...
- mysql基础之增删改查
标签: mysql 增加数据 -- 增加数据 use myblog; insert into users(username, `password`, realname) values('zhangsa ...
- openwrt交换机配置命令-swconfig
swconfig swconfig 是交换接口 (switch) 配置命令. 交换机是二层设备,是我们用来配置vlan的必备利器. 使用swconfig list可以列出当前可用的 SWITCH 设备 ...
- 中电金信:AI数据服务
01 方案简介 AI数据服务解决方案为泛娱乐.电子商务.交通出行等行业提供数据处理.数据分析.AI模型训练等服务,通过自主研发的IDSC自动化数据服务平台与客户业务流程无缝衔接,实现超低延时的 ...
- 实用干货分享(3)- Git常用操作干货分享
官方学习地址 https://git-scm.com/book/zh/v2 简单的代码提交流程 1. git status 查看工作区代码相对于暂存区的差别: 2. git add . 将当前目录下修 ...
- 【Web前端】【开源分享】H5登陆界面 - 2021年12月30日
下载地址 Gitee下载 后续更新关注本文评论区作者萌狼蓝天的回复
- 4.4 服务器上的 Git - 配置服务器
配置服务器 我们来看看如何配置服务器端的 SSH 访问. 本例中,我们将使用 authorized_keys 方法来对用户进行认证. 同时我们假设你使用的操作系统是标准的 Linux 发行版,比如 U ...