1. 程式人生 > >在 .NET 中使用 Flurl 高效處理Http請求

在 .NET 中使用 Flurl 高效處理Http請求

## 簡介 官方介紹,Flurl是一個現代的,流利的,支援非同步的,可測試的,可移植的,URL增強和Http客戶端元件。 ## Url構建 現在有一個登入的介面,地址如下: ```csharp https://www.some-api.com/login?name=Lee&pwd=123456 ``` 我們在處理這個地址的時候,會拼接 login,然後拼接`?`號,然後拼接引數,中間還要拼接`&` 得到最終的地址。 使用 Flurl 構建,首先需要通過 Nuget 安裝 `Flurl` 元件。 ```csharp var url = "http://www.some-api.com" .AppendPathSegment("login") .SetQueryParams(new { name = "Lee", pwd = "123456" }); ``` 這很簡單,這是最簡單的Get請求,同樣的我們也可以使用 Uri 的擴充套件方法 ` var url = new Uri("http://www.some-api.com").AppendPathSegment(...` ## Http 增強 Flurl 是模組化的,所以還需要安裝 `Flurl.Http` ```csharp using Flurl; using Flurl.Http; var result = await "http://www.some-api.com".AppendPathSegment("login").GetAsync(); ``` 上面的程式碼會發送一個GET請求,並返回一個`IFlurlResponse`,可以得到 StatusCode,Headers等,也可以通過 GetStringAsync 和 GetJsonAsync 得到響應內容。 如果只是想獲取響應內容,我們看看 Flurl 有多簡單: ```csharp T poco = await "http://api.foo.com".GetJsonAsync(); string text = await "http://site.com/readme.txt".GetStringAsync(); byte[] bytes = await "http://site.com/image.jpg".GetBytesAsync(); Stream stream = await "http://site.com/music.mp3".GetStreamAsync(); ``` Post提交 ```csharp await "http://api.foo.com".PostJsonAsync(new { a = 1, b = 2 }); ``` 動態型別 dynamic ```csharp dynamic d = await "http://api.foo.com".GetJsonAsync(); ``` 設定請求標頭: ```csharp await url.WithHeader("Accept", "text/plain").GetJsonAsync(); await url.WithHeaders(new { Accept = "text/plain", User_Agent = "Flurl" }).GetJsonAsync(); ``` 基礎身份驗證 ```csharp await url.WithBasicAuth("username", "password").GetJsonAsync(); ``` OAuth 2.0 ```csharp await url.WithOAuthBearerToken("mytoken").GetJsonAsync(); ``` 表單提交 ```csharp await "http://site.com/login".PostUrlEncodedAsync(new { user = "user", pass = "pass" }); ``` ## HttpClient 管理 我們通常不會建立太多的 HttpClient, 過多的連線會耗盡伺服器資源,通常會丟擲 SocketException 異常,大部分還是使用 HttpClientFactory。 在 Flurl 庫中,它是內部管理 HttpClient例項, 通常一個主機Host,會建立一個HttpClient,然後快取來複用。 Flurl 也很好的支援了IOC容器,你也可以在依賴注入中使用它。 ## 總結 Flurl 元件讓Http操作變得更簡單易用,你可以在專案中嘗試使用它,其他的還有一些功能,可測試可配置等,你都可以在官網找到它的文件。 歡迎掃碼關注我們的公眾號 【全球技術精選】,專注國外優秀部落格的翻譯和開源專案分享。