前言
今天大姚给大家分享一个.NET开源(MIT License)、免费、现代化、流畅、可测试、可移植的URL构建器和HTTP客户端库:Flurl。
项目介绍
Flurl是一个集现代性、流畅性、异步性、可测试性、可移植性于一身的URL构建器与HTTP客户端库。它提供了简洁的API,使得HTTP请求的发送与URL的构建变得极为简单与直观。无论是构建复杂的URL路径,还是设置查询参数、请求头或认证信息,Flurl都能以几乎零学习成本的方式实现。
项目源代码
项目使用
安装项目NuGet包
Flurl.Http 是一个构建在 Flurl 基础之上的 HTTP 客户端库。它提供了发送 HTTP 请求(GET、POST、PUT、DELETE 等)的简洁、流畅的 API:
Install-Package Flurl.Http
Flurl 是 Flurl.Http 的基础库,它主要关注于 URL 的构建和解析:
PM> Install-Package Flurl
URL 构建器
using Flurl;
var url = "https://some-api.com"
 .AppendPathSegment("endpoint")
 .SetQueryParams(new {
 api_key = _config.GetValue<string>("MyApiKey"),
 max_results = 20,
 q = "I'll get encoded!"
 })
 .SetFragment("after-hash");
// result:
// https://some-api.com/endpoint?api_key=xxx&max_results=20&q=I%27ll%20get%20encoded%21#after-hash
"https://some-api.com".SetQueryParam("x", new[] { 1, 2, 3 }); // https://some-api.com?x=1&x=2&x=3
"https://some-api.com"
 .AppendQueryParam("x", 1);
 .AppendQueryParam("x", 2);
 .AppendQueryParams("x", new[] { 3, 4 }); // https://some-api.com?x=1&x=2&x=3&x=4
模拟和记录HTTP请求
using Flurl;
using Flurl.Http;
var resultData = await "https://some-api.com"
 .AppendPathSegment("endpoint") 
 .GetStringAsync();
var result = await "http://api.foo.com".PostJsonAsync(requestObj).ReceiveJson<T>();
var resultStr = await "http://api.foo.com/1".PatchJsonAsync(requestObj).ReceiveString();
var resultStr2 = await "http://api.foo.com/2".PutStringAsync("hello").ReceiveString();
var resp = await "http://api.foo.com".OptionsAsync();
await "http://api.foo.com".HeadAsync();
文件上传相关:
var resp = await "http://api.com".PostMultipartAsync(mp => mp
 .AddString("name", "hello!") // individual string
 .AddStringParts(new {a = 1, b = 2}) // multiple strings
 .AddFile("file1", path1) // local file path
 .AddFile("file2", stream, "foo.txt") // file stream
 .AddJson("json", new { foo = "x" }) // json
 .AddUrlEncoded("urlEnc", new { bar = "y" }) // URL-encoded 
 .Add(content)); // any HttpContent
下载文件:
// filename is optional here; it will default to the remote file name
var path = await "http://files.foo.com/image.jpg"
 .DownloadFileAsync("c:\\downloads", filename);
处理超时错误:
try {
 var result = await url.GetStringAsync();
}
catch (FlurlHttpTimeoutException) {
 // handle timeouts
}
catch (FlurlHttpException) {
 // handle error responses
}
项目源码地址
更多项目实用功能和特性欢迎前往项目开源地址查看??,别忘了给项目一个Star支持??。
GitHub开源地址:https://github.com/tmenier/Flurl 
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没??)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md 
