c#進階(6)—— 網絡通信基礎知識
阿新 • • 發佈:2017-12-18
pro erb sin ase nic param row mmu res 1、HttpClient 類
(1)、HttpClient 類 用於發送HTTP 請求,接收請求的響應。
(2)、HttpClient 類 派生於 HttpMessageInvoker類,此基類負責執行 SendAsync(),SendAsync() 方法調用是異步的,可以編寫一個完全異步的系統來調用Web服務。
2、實例
(1)、發出異步的Get 請求。
namespace InternetCommunicate { class Program { private const string baiduUrl = "http://www.baidu.com.cn"; private const string googleUrl = "http://www.google.com"; static void Main(string[] args) { } /// <summary> /// 異步調用Get方法 /// </summary> /// <returns></returns> public async Task GetDataSimpleAsync() {//實例化一個httpClient 對象,該對象是線程安全的, //client 對象可以處理多個請求,HttpClient 每個實例都維護自己的線程池, //HttpClient 實例之間的請求被隔離,調用Dispose方法釋放資源。 using (var client = new HttpClient()) { //調用 GetAsync(),給他傳遞要調用的方法地址,把HTTP GET 請求發送給服務器, //GetAsync() 返回一個 HttpResponseMessage對象,包含//(1)、標題 //(2)、狀態 //(3)、內容 HttpResponseMessage response = await client.GetAsync(baiduUrl); //如果請求成功 if(response.IsSuccessStatusCode) { Console.WriteLine($"Response Status Code:{(int)response.StatusCode}" + $"{response.ReasonPhrase}"); //通過ReadAsStringAsync方法,把返回的內容檢索為一個字符串。 string responseBodyAsText = await response.Content.ReadAsStringAsync(); Console.WriteLine($"Received payLoad of {responseBodyAsText.Length} characters"); Console.WriteLine(responseBodyAsText); Console.ReadLine(); } } } } }
(3)、傳遞httpheader(標題)
發出請求時,沒有設置或改變任何標題,但HttpClient 的DefaultRequestHeaders 屬性允許設置或改變標題,使用Add 方法可以給集合添加標題,設置標題和標題值後,會與HttpClient 實例發送的每個請求一起發送。 在本示例中,添加以json作為格式的標題值。代碼如下:/// <summary> /// 展示http 標題 /// </summary> /// <param name="title"></param> /// <param name="httpHeaders"></param> public static void ShowHeaders(string title,HttpHeaders httpHeaders) { foreach (var header in httpHeaders) { string value = string.Join(" ", header.Value); Console.WriteLine($"Header:{header.Key} Value:{value}"); } } /// <summary> /// 設置httpHeader 傳遞標題的信息 /// </summary> /// <returns></returns> public async Task GetDataWithHeadersAsync() { try { using(var client = new HttpClient()) { //添加作為json數據格式的標題值 client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose"); //DefaultRequestHeaders 獲取與每個請求一起發送的值 ShowHeaders("Request Headers:", client.DefaultRequestHeaders); //獲取http 響應頭的值 HttpResponseMessage response = await client.GetAsync(googleUrl); ShowHeaders("Response Headers:", response.Headers); } } catch (Exception ex) { throw ex; } }(4)、用HttpMessageHandler自定義請求 創建一個派生於HttpClientHandler的類,重寫SendAsync()方法,該方法需要返回一個Task,對於錯誤的情況,不需要調用異步方法,只用Task.FromResult返回即可。
public class SampleMessageHandler:HttpClientHandler { private string _message; public SampleMessageHandler(string message) { _message = message; } protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request,CancellationToken cancellationToken) { if(_message == "error") { var response = new HttpResponseMessage(HttpStatusCode.BadRequest); return Task.FromResult<HttpResponseMessage>(response); } return base.SendAsync(request, cancellationToken); } } /// <summary> /// 用HttpMessageHandler自定義請求 /// </summary> /// <returns></returns> public static async Task GetDataWithMessageHandlerAsync() { //如果消息是error,把響應的狀態碼設置為bad request var client = new HttpClient(new SampleMessageHandler("error")); HttpResponseMessage responseMessage = await client.GetAsync(googleUrl); //etc }(5)、使用SendAsync 創建HttpRequestMessage 使用SendAsync,可以對定義請求有更多的控制,重載HttpRequestMessage類的構造函數,傳遞HttpMethod的一個值,GetAsync方法用Get方式創建一個HTTP請求。 使用HttpMethod 不僅可以發送GET、POST、PUT和DELETE 請求,還可以發送HEAD、OPTIONS和Trace。 具體代碼如下:
/// <summary> /// 使用SendAsync 創建HttpRequestMessage /// </summary> /// <returns></returns> private async Task GetDataAdvanceAsync() { using(var client = new HttpClient()) { var request = new HttpRequestMessage(HttpMethod.Get, googleUrl); HttpResponseMessage response = await client.SendAsync(request); } }
c#進階(6)—— 網絡通信基礎知識