先上代碼,先說自己為什么會用到這個技術
自己一開始寫的代碼,是要設置一個參數放置在請求Header中,列如:
HttpClient httpClient = _myhttpclient.CreateClient(); var obj = new JObject { { "xxxx", whse }, { "xxxx", sonumber } }; HttpContent content = new StringContent(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json"); //這里是要Add一個RequestHeaders屬性 httpClient.DefaultRequestHeaders.Add("Authorization", token); var Result = httpClient.PostAsync(url, content).GetAwaiter().GetResult(); var s = Result.Content.ReadAsStringAsync(); var j = JObject.Parse(s.Result);
如果使用Flurl該怎么寫呢
var j = await Url .WithHeader("Authorization", day_token) .PostJsonAsync(new JObject { { "owner", whse }, { "soNos", sonumber } }) .ReceiveJson<JObject>(); var Json = JsonConvert.SerializeObject(j);
這個Url會“點”出來許多Flurl的屬性方法,這樣我們就可以給一些需要的請求去加參數
相比較對比上面的代碼就很簡單多了
介紹及優點
官方介紹,Flurl是一個現代的,流利的,支持異步的,可測試的,可移植的,URL增強和Http客戶端組件。
Flurl 組件讓Http操作變得更簡單易用,你可以在項目中嘗試使用它,其他的還有一些功能,可測試可配置等,你都可以在官網找到它的文檔
Flurl允許您直接從連貫URL構建器鏈執行許多常見的HTTP任務。其下是HttpClient和相關類。
正如您將看到的,Flurl使用方便的方法和流暢的優點增強了HttpClient,但並沒有試圖完全抽象它
在 Flurl 庫中,它是內部管理 HttpClient實例, 通常一個主機Host,會創建一個HttpClient,然后緩存來復用。
Flurl 也很好的支持了IOC容器,你也可以在依賴注入中使用它。
1:命名空間 using Flurl; using Flurl.Http;
2、使用Nuget安裝引用Flurl.Http(Fluent HTTP) 相關文檔:VS(Visual Studio)中Nuget的使用 2)使用Package Manager命令安裝 PM> Install-Package Flurl.Http -Version 2.4.2 3)使用.NET CLI命令安裝 > dotnet add package Flurl.Http --version 2.4.2 3、執行GET和HEAD請求響應HttpResponseMessage 相關文檔:HttpResponseMessage var getResp = await "http://api.foo.com".GetAsync(); var headResp = await "http://api.foo.com".HeadAsync(); 3、獲取請求JSON數據 從JSON API獲取強類型的poco對象: T poco = await "http://api.foo.com".GetJsonAsync(); 當創建類來匹配JSON時,非通用版本返回一個dynamic: dynamic d = await "http://api.foo.com".GetJsonAsync(); 從一個返回JSON數組的API獲取一個動態列表: var list = await "http://api.foo.com".GetJsonListAsync(); 4、獲取請求strings, bytes, 和streams 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(); 5、下載文件 // 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); 6、Post提交數據(JSON、Html Form) POST提交JSON數據 await "http://api.foo.com".PostJsonAsync(new { a = 1, b = 2 }); 模擬HTML表單post提交 await "http://site.com/login".PostUrlEncodedAsync(new { user = "user", pass = "pass" }); 上述Post方法返回一個任務<HttpResponseMessage>。當然,您可能希望在響應體中返回一些數據: T poco = await url.PostJsonAsync(data).ReceiveJson<T>(); dynamic d = await url.PostUrlEncodedAsync(data).ReceiveJson(); string s = await url.PostUrlEncodedAsync(data).ReceiveString(); 7、配置http請求頭(header) // one: await url.WithHeader("Accept", "text/plain").GetJsonAsync(); // multiple: await url.WithHeaders(new { Accept = "text/plain", User_Agent = "Flurl" }).GetJsonAsync(); 在上面的第二個示例中,User_Agent將自動呈現為User-Agent標題名稱。(連字符在標頭名稱中非常常見,但在C#標識符中不允許;下划線,恰恰相反)。 使用Basic authentication驗證: await url.WithBasicAuth("username", "password").GetJsonAsync(); OAuth 2.0 bearer token: await url.WithOAuthBearerToken("mytoken").GetJsonAsync(); 8、配置Fluent HTTP (Flurl) 設置超時(timeout)時間 await url.WithTimeout(10).DownloadFileAsync(); // 10 seconds await url.WithTimeout(TimeSpan.FromMinutes(2)).DownloadFileAsync(); 設置cookies // one: await url.WithCookie("name", "value", expDate).HeadAsync(); // multiple: await url.WithCookies(new { c1 = 1, c2 = 2 }, expDate).HeadAsync(); // date is optional; excluding it makes it a session cookie. 取消請求 var cts = new CancellationTokenSource(); var task = url.GetAsync(cts.Token); ... cts.Cancel(); 一些不太常見的場景: // 使用 "raw" System.Net.Http.HttpContent object await url.PostAsync(httpContent); // 使用HttpMethod指定請求方式 await url.SendJsonAsync(HttpMethod.Options, poco); // 執行更復雜配置的請求 await url.SendAsync( HttpMethod.Trace, httpContent, // optional cancellationToken, // optional HttpCompletionOption.ResponseHeaderRead); // optional