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/ 在开源项目满天飞的时代,仅仅把开源项目拿来用是不够的,要适 ...
随机推荐
- Tricks
由于本人着实有些菜,因此在此积累一些巧妙的 \(Tricks\) ,以备不时之需... 与其说是 \(Tricks\) 不如说是学习笔记?? 数学 组合数 常见的数列 斐波那契数列 图论 树论 \(P ...
- 代码注释规范之Doxygen
1.Doxygen简介 Doxygen是一个程序的文档产生工具,可以将程序中的注释转换成说明文档或者说是API参考手册,从而减少程序员整理文档的时间.当然这里程序中的注释需要遵循一定的规则书写,才能让 ...
- Flask - 解决 app.run() 添加 host、port、debug 参数后运行不生效的问题
问题背景 app.run() 添加了 host.port.debug 参数,运行后发现没有生效,咋肥事! 解决方案 要打开 debug 模式的话,勾选 FLASK_DEBUG 就好啦 再次运行,发现已 ...
- C#提取程序的图标
需要添加对System.Management.dll的引用 ,并且不要忘记导入下面的名称空间. using System.Management; 将ListView和 ImageList控件从可视 ...
- 在C++11编译环境中,简单自测了一下C++标准库中的string/vector和迭代器,记录一下
#include <iostream> #include <vector> using namespace std; int main() { //////////////// ...
- php时间区间,优化显示
<?php /** * 类似微信的时间显示 * 规则是:今天的,显示几秒前,几分钟前,几小时前,昨天的显示昨天 上午 XX:XX * 再往前,本周的,显示周几+时间,再往前,本年的,显示月日+时 ...
- 【OI】C++STL初步 排序与检索
从紫皮书过来的,但是书中内容讲的比较简洁,做一点补充笔记. 一.排序(sort函数) 头文件:<algorithm> 语法:sort(start,end,cmp); start,end必须 ...
- npm WARN ajv-keywords@2.1.1 requires a peer of ajv@^5.0.0 but none is installed. You must install peer dependencies yourself.
解决: npm install -g npm-install-peers npm install -g npm npm i ajv 但是好像没啥用
- Java基础系列(39)- 二维数组
多维数组 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 二维数组 int a[][]=new int[2][5]; 解析:以上二维数组a可以看成一个 ...
- centos7 kubeadm 搭建k8s
Centos 7 搭建 kubernetes 集群环境 一.介绍 本次是centos7 搭建kubernetes1.15.9 通过kubeadm 的形式搭建 二.准备 > centos 7 (镜 ...