System.Net.Http

這種人發表於2018-07-22

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)
    {
        //對資訊進行處理
    }
}