.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比较常用于类似登录的拦截等场景.但是,当过滤器的配置不当时就会把所有的请求都拦截,静态资源也会被拦截掉,导致静态页面加载不出来. 一般的解决方 ...
随机推荐
- python socket检测端口及ping检测
python根据socket模块检测端口及vip #!/usr/bin/env python # -*- coding: utf8 -*- from .ping_helper import Pinge ...
- Spring MVC 3.2 技术预览(一):Servlet 3介绍,异步支持
原文地址:http://blog.springsource.org/2012/05/06/spring-mvc-3-2-preview-introducing-servlet-3-async-supp ...
- ANTLR语法层的选项及动作 - ANTLR
ANTLR语法层的选项 ANTLR语法层的选项中可以设置一系列的键值从而影响ANTLR输出的代码.这些选项是全局的,除非在某条规 则中覆盖了这些选项,否则这些选项会影响到该语法中的所有元素.选项应该紧 ...
- 数据库管理软件之DataGrip
DataGrip 是由JetBrains公司推出的数据库管理软件,DataGrip支持几乎所有主流的关系数据库产品,如DB2.Derby.H2.MySQL.Oracle.PostgreSQL.SQL ...
- @EnableAutoConfiguration 标签使用
@EnableAutoConfiguration 这个注解的作用是: 从classpath中搜索所有META-INF/spring.factories配置文件然后,将其中org.springframe ...
- JAVA8的computeIfAbsent使用方法
基础说明 computeIfAbsent 是 Java 8 引入的 Map 接口中的一个默认方法.它允许你以原子操作的方式在给定键不存在时计算其值,并将其添加到映射中.如果该键已经存在,则返回已存在的 ...
- Linux安装JDK,解压报错:gzip: stdin: not in gzip format
问题描述 在Linux安装JDK tar -zxvf 命令解压时,报错,无法解压 报错内容: gzip: stdin: not in gzip format tar: Child returned s ...
- kubeadm init问题
1.解析不到对应的主机 [WARNING Hostname]: hostname "k8s-master-01" could not be reached [WARNING Ho ...
- https://eggjs.org/zh-cn/basics/env.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83
转载:https://eggjs.org/zh-cn/basics/env.html#自定义环境 运行环境 一个 Web 应用本身应该是无状态的,并拥有根据运行环境设置自身的能力. 指定运行环境 框架 ...
- hive表元数据读取不到
MetaException(message:java.lang.UnsupportedOperationException: Storage schema reading not supported) ...