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. rtsp->rtmp 推流直播 Plan B

    上篇文章我们谈到使用 EasyDarwin 推流后 前端HTML播放器 播放无画面的情况,找了各种播放器都服务正常解决,但使用VLC却能正常播放的问题,我们尝试了很久最后另辟蹊径,找到 nginx安装 ...

  2. 八、Abp vNext 基础篇丨标签聚合功能

    介绍 本章节先来把上一章漏掉的上传文件处理下,然后实现Tag功能. 上传文件 上传文件其实不含在任何一个聚合中,它属于一个独立的辅助性功能,先把抽象接口定义一下,在Bcvp.Blog.Core.App ...

  3. SQLmap的基本命令

    Sqlmap sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入.目前支持的数据库有MySql.Oracle.Access.PostageSQL.SQL  ...

  4. TP5增加扩展配置目录

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

  5. 深入xLua实现原理之C#如何调用Lua

    本文主要是探讨xLua下C#调用Lua的实现原理,有关Lua如何调用C#的介绍可以查看深入xLua实现原理之Lua如何调用C# C#与Lua数据通信机制 无论是Lua调用C#,还是C#调用Lua,都需 ...

  6. Shell系列(11)- 位置参数变量(4)

    作用 往shell脚本里面传递参数 位置参数变量 作用 $n n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 ${10} $* 这个变量代表命令行中 ...

  7. 华为云计算IE面试笔记-桌面云用户登录连接流程及故障处理?

    1-10:桌面与系统验证成功                           http协议 11-19:桌面list(VM列表)获取,选择                http协议 20-30: ...

  8. php CURL 发送http请求 GET POST

    * CURL http://www.php.net/manual/en/book.curl.php http://jp2.php.net/manual/en/function.curl-setopt. ...

  9. IdentityServer4[2]:启动一个新的IdentityServer项目

    启动一个新的IdentityServer项目 从头开始,从基础开始,然后变得更加复杂,循序渐进的学习 工具:VS2017 15.9.8 .Net Core2.2 基本过程 创建一个新的ASP.NET ...

  10. npm install失败或者进度卡住解决办法 以及 nrm的使用

    今天在使用npm install安装url-loader时,遇到下载进度条停止问题 因为已经提前更换了 淘宝的镜像,应该不是网络问题,通过 npm config set loglevel info 显 ...