HttpClient.PatchAsJsonAsync - dotnet/runtime 项目贡献小记
TL;DR
迫于 PatchAsJsonAsync 方法缺失,我给 dotnet/runtime 项目贡献了相关的 API,可惜要到 .NET7 才能用上。
https://github.com/dotnet/runtime/pull/60672
正文
同事小张 的 issue 收到了回复,希望他可以提供一个标准的 API Proposal 以供后续 review 使用。坐在隔壁的我得知此事之后,主动接过了这个锅([API Proposal]: HttpClient.PatchAsJsonAsync()),然后就有了这篇博文接下来的内容。
API Review 是线上直播的模式,有兴趣的可以去看一下,还是挺好玩的,issue 里有提到视频的地址。

视频里有提到,这个 API 是从 json.net 相关的 API 迁移过来的,当时就没有 PATCH 方法的重载。显然 PATCH 方法没什么人用,这个 API 就惨遭 Overlooked(忽视) 了。
一个悲伤的故事,我的 Proposal 里 API 是直接复制粘贴然后替换的,里面有个语法错误,Review 的人也是复制粘贴的,幸好后来有人发现了(果然天下程序员都是一招 Ctrl + CV)。
接下来进行开发,其实也就是复制粘贴的事 = =。
首先在 GitHub fork dotnet/runtime 存储库,再克隆到本地。
我平时主要使用 Rider,因此 VS 里很多工作负载没装。在 VS Installer 里勾上 .NET 桌面开发,Python 开发和 C++ 桌面开发,根据提示重启电脑。

一定要记得 关闭 Resharper,不然之后打开 VS 的时候就会这样:

接下来根据官方给的步骤走就可以(https://github.com/dotnet/runtime/blob/main/docs/workflow/building/libraries/README.md)
打开终端,导航到项目文件夹下面,运行命令 build.cmd clr+libs -rc Release。
如果不想看到 VS 里满屏的红色波浪线的话,一定要先做这一步。
这次我们需要修改的代码位于 System.Net.Http.Json 命名空间下,在对应文件夹里找到解决方案文件,用 VS 打开就可以。
可以看到里面的文件排布十分有规律,复制 Post 的文件然后批量改成 Patch。

注意到一个问题,HttpClient.PatchAsync 在 .net46 和 .netstandrad 里是没有的,只能想办法兼容了(开发任务突然增加)。

之前我是没有做过兼容多个 SDK 的项目的,只能先看看同项目下面其他方法是如何操作的,观察到 csproj 里有这样的代码:

用 Condition 选择性编译了一些文件,那么这里就可以将 HttpClient.PatchAsync 反向迁移回去,搜索一下目前的实现,然后复制粘贴为 HttpClientJsonExtensions.netstandard.cs。
private static Task<HttpResponseMessage> PatchAsync(this HttpClient client, string? requestUri, HttpContent content, CancellationToken cancellationToken)
{
Uri? uri = string.IsNullOrEmpty(requestUri) ? null : new Uri(requestUri, UriKind.RelativeOrAbsolute);
return client.PatchAsync(uri, content, cancellationToken);
}
private static Task<HttpResponseMessage> PatchAsync(this HttpClient client, Uri? requestUri, HttpContent content, CancellationToken cancellationToken)
{
// HttpClient.PatchAsync is not available in .NET standard and NET462
HttpRequestMessage request = new HttpRequestMessage(HttpPatch, requestUri) { Content = content };
return client.SendAsync(request, cancellationToken);
}
(突然想到,如果我声明为 public 是不是顺便就给 .netstandard2.0 提供了 PatchAsync 方法呢?)
修复编译错误之后,在 ref 里面添加方法声明(同样也是复制粘贴替换)。
接下来就是写测试,复制 POST 方法的测试然后改成 PATCH 就行了(CVH 大法好)。
然后提交 PR 就 ok 了,当然 PR review 过程也比较曲折,有兴趣的可以看一下开头 PR 里的 Conversation,对我多年不用的英语写作提出了巨大考验。
最近有很多博主都喜欢在最后放自己的微信公众号、打赏链接之类的。作为 N 年前迁移博客园博客系统到 .Net Core 的始作俑者(一系列 故障公告),大家多多使用博客园写博文就是对我最好的支持了 ╰(°▽°)╯。
另,有点想像 The Old New Thing 一样写一些博客园开发中遇到的好玩事情,不知道有没有人想看hhhh。(dudu 不要打我hhh)
HttpClient.PatchAsJsonAsync - dotnet/runtime 项目贡献小记的更多相关文章
- 使用GitHub进行协同项目开发和开源项目贡献
本教程致力于摆脱git命令行快速的学习使用GitHub. 此次是GitHub课程的第三次课程,也是最后一次课程.推荐进行按照次序查看本次教程.上篇文章:程序员,一起玩转GitHub版本控制,超简单入门 ...
- 花20分钟写的-大白话讲解如何给github上项目贡献代码
原文地址:http://site.douban.com/196781/widget/notes/12161495/note/269163206/ 本文献给对git很迷茫的新手,注意是新手,但至少会点基 ...
- 解决VS2015无法调试dotnet core项目
dotnet core 1.0正式版和VS2015 update3安装后一直无法在VS中正常调试. 错误提示:The debugger's worker process (msvsmon.exe) u ...
- (转)大白话讲解如何给github上项目贡献代码
转自:https://site.douban.com/196781/widget/notes/12161495/note/269163206/ 2013-03-30 22:53:55 本文献给对g ...
- 大白话讲解如何给github上项目贡献代码
本文献给对git很迷茫的新手,注意是新手,但至少会点基本操作,有点基本概念的新手,我不会从怎么用github和git是什么开始讲的.如果作为新手你看书又看不进去,原理又太复杂,又没有直接了当告诉我们怎 ...
- 我给Apache顶级项目贡献了点源码。
这是why技术的第 91 篇原创文章 这篇文章其实并没有什么技术性的分享,从我的角度而言,更多是记录和思考. 把我对于源码和之前写的部分文章反哺给我的一些东西,带来的一点点思考分享给大家. 一行源码 ...
- [GitHub]第六讲:开源项目贡献流程
Github 是目前世界上最大的开源项目的托管交流平台.贡献开源项目的流程也是 Github 全力支持的,也一样是遵循 Github Flow,虽然跟前面团队合作流程会有一点差别.在团队内部,大家都是 ...
- GitHub上fork一个项目贡献代码以及同步原作者的修改【转】
如何贡献自己的力量 首先你总得有自己的github帐号吧,注册一个,非常简单,只需用户名,邮箱,密码,邮箱只是用来找回密码的,不做验证.因此注册后立即能用!比如我现在新注册一个叫JsLouvre的示范 ...
- 转帖:向开源项目贡献源码(以 Orchard 为例)
原文地址:http://yangw80.blog.163.com/blog/static/247518002201552692516908/ 在开源项目满天飞的时代,仅仅把开源项目拿来用是不够的,要适 ...
随机推荐
- python使用UTF-8写入CSV中文乱码
使用encoding='utf-8',写入的文档是乱码. 解决办法: 修改encoding='utf-8-sig' 关于文件open()函数: open(path,'-模式-',encoding='u ...
- NRF52832空中升级DFU
Secure DFU环境搭建 升级原理,加密原理在此不做描述,详情参考http://www.cnblogs.com/iini/p/9314246.html 1.工具一览 gcc-arm-none-ea ...
- coreos 常见问题
1.如果docker run的时候报如下错误: error creating overlay mount to /var/lib/docker/overlay2/... ... 则需要修改/run/s ...
- go语言游戏服务端开发(一)——架构
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例. 网络游戏程序分为客户端和服务端.客户端负责图形渲染.交互和一些简单校验处理,服务端负责业务逻辑处理.数据存储. 我们开发一个游戏de ...
- Spring Boot 2.x 之 H2 数据库
1. Spring Boot下H2数据库的常用配置项 # 指定数据库的类型 spring.datasource.platform=h2 # 数据库连接地址(文件模式) ## AUTO_SERVER=T ...
- 简单学习PHP中的层次性能分析器
在 PHP 中,我们需要进行调试的时候,一般都会使用 memory_get_usage() 看下内存的使用情况.但如果想看当前的脚本 CPU 的占用情况就没有什么现成的函数了.不过,PHP 也为我们提 ...
- 一文让你彻底搞懂 vue-Router
路由是网络工程里面的专业术语,就是通过互联把信息从源地址传输到目的地址的活动.本质上就是一种对应关系.分为前端路由和后端路由. 后端路由: URL 的请求地址与服务器上的资源对应,根据不同的请求地址返 ...
- httprunner开发实践&源码解析
上次作业讲解 排错 控制台查看报错信息 打开代理工具,调试脚本 注释掉其他接口,先跑一个接口 pip uninstall httprunner 修复断言100为int型问题 修复两次登陆问题 报告 p ...
- 压测中的QPS与TPS区别
原文来自:https://www.cnblogs.com/fkkk/p/11957566.html QPS(每秒查询率)=并发数/平均响应时间 TPS(每秒处理事务数)=请求数/时间(秒) TPS的过 ...
- 前端js单元测试 使用mocha、chai、sinon,karma
karma(因果报应) 提供在浏览器上测试 可以同时跑在多个浏览器下 mocha测试框架 其他测试框架还有Jasmine chai断言库 expect = chai.expect sinon ...