c#进阶(6)—— 网络通信基础知识
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 requestvar 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)—— 网络通信基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABP入门系列(14)——应用Boots
- 下一篇: C#多线程之旅(1)——介绍和基本概念