System.Net.Http
DotNet菜園
佔個位置^-^
2018-11-10 09:55:00修改
這個HttpClient的學習筆記一直遲遲未記錄,只引用了其他博主的部落格連結佔個位置,但被瀏覽量(138,另外一篇System.Speech使用瀏覽130)竟然是我截止2018-11-10時最多的,這讓我們情何以堪。
在專案中還是有蠻多需要用到雲服務的,比如呼叫百度翻譯API,雲報警等功能中都會用到,實現這部分功能並不困難,但是要寫的整潔漂亮還是要花點心思的。我們是一個程式碼整潔追求者,發現Go語言對這方面很有追求,我們也很喜歡這門語言,目前也在學習當中。呀,扯遠了,還是說說一些在C#中如何使用HttpClient吧。
HttpClient提供了Get和Post的操作,這兩個操作應該是能滿足我們99%的應用場景了。都提供了非同步執行。會將這部分的使用根據應用場景進行封裝,讓自己使用的得心應手,手到擒來,豈不美哉。以下是開始封裝的程式碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
namespace WindowsFormsApp1
{
public static class StCloud
{
private static string Url => "http://www.baidu.com/";
private static HttpClient httpClient;
static StCloud()
{
HttpClientHandler httpClientHandler = new HttpClientHandler();
httpClientHandler.UseCookies = true;
httpClient = new HttpClient(httpClientHandler);
}
public static string Get(string api)
{
string url = $"{Url}{api}";
return httpClient.GetStringAsync(url).Result;
}
public static string Post(string api, Dictionary<string, string> dict)
{
string url = $"{Url}{api}";
FormUrlEncodedContent formUrlEncodedContent = new FormUrlEncodedContent(dict);
return httpClient.PostAsync(url, formUrlEncodedContent).Result.Content.ReadAsStringAsync().Result;
}
public static string Post(string api, string txt)
{
string url = $"{Url}{api}";
StringContent stringContent = new StringContent(txt);
return httpClient.PostAsync(url, stringContent).Result.Content.ReadAsStringAsync().Result;
}
}
}
我習慣於將各個功能寫一個函式來條用,例如基本的登入:
public static string Login(Dictionary<string, string> dict)
{
string api = "login";
string result = Post(api, dict);
return result;
}
但我還會進一步處理登入時返回的資訊。
public static LoginResult Login(Dictionary<string, string> dict)
{
string api = "login";
string result = Post(api, dict);
LoginResult loginResult = new LoginResult(result);
return loginResult;
}
public class ResultBase
{
public string ErrorCode { get; set; }
public string Msg { get; set; }
}
public class LoginResult : ResultBase
{
public bool Successed { get; set; }
public LoginResult(string content)
{
//對資訊進行處理
}
}