WebApiClient的JsonPatch局部更新
1. 文章目的
随着WebApiClient的不断完善,越来越多开发者选择WebApiClient替换原生的HttpClient,本文将介绍使用WebApiClient来完成JsonPatch提交的新特性。
2. json patch介绍
在服务端WebApi开发的时候,如果设计一个更新登录用户的个人信息的接口,用户能更新昵称、密码、生日、性别等N多个字段,但用户在实际使用中,可能是更新其中的一个或不确定多个字段。开发者往往会为难:对于客户端没有更新到的字段,应该设置为什么值呢?一种是让客户端从服务器同步后再更新相关字段,一种是不更新的字段设置为null,服务器收到null的字段不更新,但这个还是有歧义(要更新为null的情况)。
json patch是为客户端能够局部更新服务端已存在的资源而设计的一种标准交互,在RFC6902里有详细的介绍json patch,通俗来讲有以下几个要点:
- 使用HTTP PATCH请求方法;
- 请求body为描述多个opration的数据json内容;
- 请求的Content-Type为application/json-patch+json;
以下为一个json patch请求的数据包:
PATCH /my/data HTTP/1.1
Host: example.org
Content-Length: 326
Content-Type: application/json-patch+json
If-Match: "abc123"
[
{ "op": "test", "path": "/a/b/c", "value": "foo" },
{ "op": "remove", "path": "/a/b/c" },
{ "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] },
{ "op": "replace", "path": "/a/b/c", "value": 42 },
{ "op": "move", "from": "/a/b/c", "path": "/a/b/d" },
{ "op": "copy", "from": "/a/b/d", "path": "/a/b/e" }
]
op为操作的意思,分为以下几种:
- add 添加:{“op”: "add", "path": "/xxx", "value": "xxx"},如果该属性不存,那么就添加该属性,如果属性存在,就改变属性的值。
- remove 删除:{“op”: "remove", "path": "/xxx"},删除某个属性,或把它设为默认值(例如空值)。
- replace 替换:{“op”: "replace", "path": "/xxx", "value": "xxx"},改变属性的值,也可以理解为先执行了删除,然后进行添加。
- copy 复制:{“op”: "copy", "from": "/xxx", "path": "/yyy"},把某个属性的值赋给目标属性。
- remove 移动:{“op”: "move", "from": "/xxx", "path": "/yyy"},把源属性的值赋值给目标属性,并把源属性删除或设成默认值。
- test测试:{“op”: "test", "path": "/xxx", "value": "xxx"},测试目标属性的值和指定的值是一样的。
4. Asp.net mvc接收JsonPatch
在Asp.net mvc,可以使用JsonPatchDocument类型来处理json patch内容,JsonPatchDocument可以将操作行为应用到目标实例里,得到操作之后的数据内容。
[HttpPatch]
public UserInfo Patch([FromBody] JsonPatchDocument<UserInfo> doc)
{
var user = new UserInfo
{
Account = "_Account",
Password = "_Password",
Email = "_Email"
};
doc.ApplyTo(user);
return user;
}
5. WebApiClient提交JsonPatch
在WebApiClient也提供一个JsonPatchDocument类型,该类型实现了IApiParameterable接口,在http请求之后,会执行BeforeRequestAsync方法,完成组装body的多个opration的数据json内容,使用方法如下:
public interface IPatchApi : IHttpApi
{
[HttpPatch("http://localhost:7171/api/userinfo")]
Task<string> PatchAsync(JsonPatchDocument<UserInfo> doc);
}
var doc = new JsonPatchDocument<UserInfo>();
doc.Replace(item => item.Account, "laojiu");
doc.Replace(item => item.Email, "laojiu@qq.com");
var client = HttpApiClient.Create<IPatchApi>();
await client.PatchAsync(doc);
6. 结束语
博主为WebApiClient库的作者,本文向读者介绍了JsonPatch的基本知识,以及如何在WebApiClient提交JsonPatch,欢迎大家给WebApiClient提建议。
WebApiClient的JsonPatch局部更新的更多相关文章
- 通过Solrj实现对索引库中数据的局部更新操作
for (UpdateIndexDTO updateIndexDTO : data) { // 局部更新 SolrInputDocument doc = new SolrInputDocument() ...
- .Net页面局部更新的思考
最近在修改以前做的模块,添加一个新功能.整理了下才发现重用率很低,大部分的东西还是需要重新写.功能里用到了局部更新,所有整理一下一路来实现局部更新的解决方案及改进. 我接触的项目开发大多是以Asp.n ...
- 【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价
转自: https://blog.csdn.net/eson_15/article/details/51487323 昨天把项目部署了一下,玩了玩,今天完善了一下购物车中修改商品数量就能局部 ...
- winform 实现局部更新(如ajax实现)而整个界面不产生闪烁的解决方案
转自原文winform 实现局部更新(如ajax实现)而整个界面不产生闪烁的解决方案 一.通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲) 对于大多数应用程序,.NET ...
- Elasticsearch之更新(全部更新和局部更新)
前面的基础, Elasticsearch之curl创建索引库 Elasticsearch之curl创建索引 Elasticsearch之curl创建索引库和索引时注意事项 Elasticsearch之 ...
- Solr 18 - 通过SolrJ局部更新Solr中的文档 (原子操作、非覆盖操作)
目录 1 需求分析 2 需求实现 2.1 pom.xml依赖 2.2 Java代码示例 3 补充说明 3.1 关于文档中_version_的取值说明 3.2 store=true/false的区别 1 ...
- ASP.Net Core使用Ajax局部更新
由于目前ASP.NET Core中没有提供Ajax帮助器,所以参照 上一篇帖文,使用data-ajax-*属性来使用jQuery Unobtrusive Ajax功能实现HTML的局部页面元素更新. ...
- 局部更新listview的问题(只更新某个item)
转:http://blog.csdn.net/wu_shu_jun/article/details/7794576 public void updateView(int itemIndex) { // ...
- solr的原子更新/局部更新
solr支持三种类型的原子更新: set - to set a field. add - to add to a multi-valued field. inc - to increment a fi ...
随机推荐
- poj 3243 扩展BSGS
每次把gcd(a,c)提到前面,直到a,c互质,然后就是普通BSGS了 #include<cstdio> #include<cstring> #include<iostr ...
- BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈
BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈 Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai ...
- BZOJ_1132_[POI2008]Tro_计算几何
BZOJ_1132_[POI2008]Tro_计算几何 Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3 ...
- BZOJ_2600_[Ioi2011]ricehub_二分答案
BZOJ_2600_[Ioi2011]ricehub_二分答案 Description 乡间有一条笔直而长的路称为“米道”.沿着这条米道上 R 块稻田,每块稻田的坐标均 为一个 1 到 L 之间(含 ...
- JavaWeb学习总结(转载)
JavaWeb学习总结(五十三)--Web应用中使用JavaMail发送邮件 JavaWeb学习总结(五十二)--使用JavaMail创建邮件和发送邮件 JavaWeb学习总结(五十 ...
- 【STM32H7教程】第10章 STM32H7的FLASH,RAM和栈使用情况(map和htm文件)
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第10章 STM32H7的FLASH,RAM ...
- http/2.0时代已经来临了!
知识分享 文章转自:https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/78906348 现在是资源共享的时代,同样也是知识分享的时代,如 ...
- redis-win-server 正确启动方式
C:\Users\Administrator\Desktop\Redis-x64-2.8.2402\redis-server.exe C:\Users\Administrator\Desktop\R ...
- .Net小白离开校园的第一年
Why? 2018的已经步入尾声,对新的一年又是充满期待. 在这年底里,看到园子里有很多园友写了博客回顾自己的2018,本人自知文笔和各位前辈比不了,但是我也想来写一写,这是我特殊的第一年,记录下来, ...
- 为什么HTTPS比HTTP更安全?
摘要: 理解HTTPS. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 近几年,互联网发生着翻天覆地的变化,尤其是我们一直习以为常的HTTP协议,在逐渐的被HTTPS协议所取代 ...