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 项目贡献小记的更多相关文章

  1. 使用GitHub进行协同项目开发和开源项目贡献

    本教程致力于摆脱git命令行快速的学习使用GitHub. 此次是GitHub课程的第三次课程,也是最后一次课程.推荐进行按照次序查看本次教程.上篇文章:程序员,一起玩转GitHub版本控制,超简单入门 ...

  2. 花20分钟写的-大白话讲解如何给github上项目贡献代码

    原文地址:http://site.douban.com/196781/widget/notes/12161495/note/269163206/ 本文献给对git很迷茫的新手,注意是新手,但至少会点基 ...

  3. 解决VS2015无法调试dotnet core项目

    dotnet core 1.0正式版和VS2015 update3安装后一直无法在VS中正常调试. 错误提示:The debugger's worker process (msvsmon.exe) u ...

  4. (转)大白话讲解如何给github上项目贡献代码

    转自:https://site.douban.com/196781/widget/notes/12161495/note/269163206/ 2013-03-30 22:53:55   本文献给对g ...

  5. 大白话讲解如何给github上项目贡献代码

    本文献给对git很迷茫的新手,注意是新手,但至少会点基本操作,有点基本概念的新手,我不会从怎么用github和git是什么开始讲的.如果作为新手你看书又看不进去,原理又太复杂,又没有直接了当告诉我们怎 ...

  6. 我给Apache顶级项目贡献了点源码。

    这是why技术的第 91 篇原创文章 这篇文章其实并没有什么技术性的分享,从我的角度而言,更多是记录和思考. 把我对于源码和之前写的部分文章反哺给我的一些东西,带来的一点点思考分享给大家. 一行源码 ...

  7. [GitHub]第六讲:开源项目贡献流程

    Github 是目前世界上最大的开源项目的托管交流平台.贡献开源项目的流程也是 Github 全力支持的,也一样是遵循 Github Flow,虽然跟前面团队合作流程会有一点差别.在团队内部,大家都是 ...

  8. GitHub上fork一个项目贡献代码以及同步原作者的修改【转】

    如何贡献自己的力量 首先你总得有自己的github帐号吧,注册一个,非常简单,只需用户名,邮箱,密码,邮箱只是用来找回密码的,不做验证.因此注册后立即能用!比如我现在新注册一个叫JsLouvre的示范 ...

  9. 转帖:向开源项目贡献源码(以 Orchard 为例)

    原文地址:http://yangw80.blog.163.com/blog/static/247518002201552692516908/ 在开源项目满天飞的时代,仅仅把开源项目拿来用是不够的,要适 ...

随机推荐

  1. Linux下查看哪个网口插了网线

    场景: 一台服务器有多个网卡,一个网卡有多个网口,当插了一根网线的时候,不知道网线是插在哪一个网口. 1.查看网口信息 2.查看网口是否插了网线(命令ethtool) 命令:ethtool + 网口名 ...

  2. NumPy的基本操作

    1 简介 NumPy 是用于处理数组的 python 库,部分用 Python 编写,但是大多数需要快速计算的部分都是用 C 或 C ++ 编写的.它还拥有在线性代数.傅立叶变换和矩阵领域中工作的函数 ...

  3. GC-优化-案例

    优化案例 Service S 优化 现在看一下执行jstat -gcutil的结果 S0 S1 E O P YGC YGCT FGC FGCT GCT 12.16 0.00 5.18 63.78 20 ...

  4. Apollo 配置中心详细教程

    一.简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理 ...

  5. 数据结构与算法——平衡二叉树(AVL树)

    目录 二叉排序树存在的问题 基本介绍 单旋转(左旋转) 树高度计算 旋转 右旋转 双旋转 完整代码 二叉排序树存在的问题 一个数列 {1,2,3,4,5,6},创建一颗二叉排序树(BST) 创建完成的 ...

  6. 最长公共前缀 js 实现代码

    编写一个函数来查找字符串数组中的最长公共前缀: 输入 : ["abca","abc","abca","abc",&quo ...

  7. PHP中的IMAP扩展简单入门

    对于邮件处理来说,大家比较熟悉的应该是 POP3 . SMTP 这类的协议,而今天我们介绍的 IMAP 其实也是非常常用的一种邮件处理协议.它和 POP3 比较类似,都是以接收处理邮件为主.不过相对于 ...

  8. 一起搞懂PHP的错误和异常(三)

    关于错误与异常的最后一篇文章,我们来进行一些总结. PHP中错误和异常的区别 通过前面两篇文章的学习,我们来直接将错误和异常摆上来进行对比,看看他们的区别与联系: 错误的出现通常是语法或编译运行时错误 ...

  9. vue跳转路由

    1.  router-link 1. 不带参数 <router-link :to="{name:'home'}"> <router-link :to=" ...

  10. TP5增加扩展配置目录

    ThinkPHP5.0.1版本开始增加了扩展配置目录的概念,在应用配置目录或者模块配置目录下面增加extra子目录,下面的配置文件都会自动加载,无需任何配置. 这极大的方便了我们进行扩展配置,比如在a ...