基于C#實(shí)現(xiàn)任意格式JSON文本的HTTP交互抽象類
引言
為了實(shí)現(xiàn)一個支持任意格式JSON交互的抽象類,并且在整個過程中不需要對JSON格式數(shù)據(jù)進(jìn)行序列化和反序列化操作,可以使用C#中的HttpClient類來進(jìn)行HTTP請求和響應(yīng)。下面將創(chuàng)建一個抽象類JsonHttpClient,它封裝了HTTP請求和響應(yīng)的邏輯,并且允許直接處理JSON字符串。
1. 創(chuàng)建抽象類 JsonHttpClient
using System; using System.Net.Http; using System.Text; using System.Threading.Tasks; public abstract class JsonHttpClient { // HttpClient實(shí)例,用于發(fā)送HTTP請求 private readonly HttpClient _httpClient; // 構(gòu)造函數(shù),初始化HttpClient protected JsonHttpClient() { _httpClient = new HttpClient(); } // 發(fā)送HTTP請求的抽象方法,子類必須實(shí)現(xiàn) protected abstract Task<HttpResponseMessage> SendRequestAsync(HttpRequestMessage request); // 發(fā)送HTTP GET請求 public async Task<string> GetAsync(string uri) { // 創(chuàng)建HTTP GET請求 var request = new HttpRequestMessage(HttpMethod.Get, uri); // 發(fā)送請求并獲取響應(yīng) var response = await SendRequestAsync(request); // 確保響應(yīng)成功 response.EnsureSuccessStatusCode(); // 讀取響應(yīng)內(nèi)容并返回 return await response.Content.ReadAsStringAsync(); } // 發(fā)送HTTP POST請求 public async Task<string> PostAsync(string uri, string jsonContent) { // 創(chuàng)建HTTP POST請求 var request = new HttpRequestMessage(HttpMethod.Post, uri) { Content = new StringContent(jsonContent, Encoding.UTF8, "application/json") }; // 發(fā)送請求并獲取響應(yīng) var response = await SendRequestAsync(request); // 確保響應(yīng)成功 response.EnsureSuccessStatusCode(); // 讀取響應(yīng)內(nèi)容并返回 return await response.Content.ReadAsStringAsync(); } // 發(fā)送HTTP PUT請求 public async Task<string> PutAsync(string uri, string jsonContent) { // 創(chuàng)建HTTP PUT請求 var request = new HttpRequestMessage(HttpMethod.Put, uri) { Content = new StringContent(jsonContent, Encoding.UTF8, "application/json") }; // 發(fā)送請求并獲取響應(yīng) var response = await SendRequestAsync(request); // 確保響應(yīng)成功 response.EnsureSuccessStatusCode(); // 讀取響應(yīng)內(nèi)容并返回 return await response.Content.ReadAsStringAsync(); } // 發(fā)送HTTP DELETE請求 public async Task<string> DeleteAsync(string uri) { // 創(chuàng)建HTTP DELETE請求 var request = new HttpRequestMessage(HttpMethod.Delete, uri); // 發(fā)送請求并獲取響應(yīng) var response = await SendRequestAsync(request); // 確保響應(yīng)成功 response.EnsureSuccessStatusCode(); // 讀取響應(yīng)內(nèi)容并返回 return await response.Content.ReadAsStringAsync(); } }
2. 實(shí)現(xiàn)具體的HTTP客戶端類
可以創(chuàng)建一個具體的HTTP客戶端類,繼承自JsonHttpClient
,并實(shí)現(xiàn)SendRequestAsync
方法。
public class MyHttpClient : JsonHttpClient { // 實(shí)現(xiàn)SendRequestAsync方法 protected override async Task<HttpResponseMessage> SendRequestAsync(HttpRequestMessage request) { // 使用HttpClient發(fā)送請求并返回響應(yīng) return await _httpClient.SendAsync(request); } }
3. 使用案例
下面是一個從發(fā)送HTTP請求到獲取響應(yīng)并顯示在控制臺的完整案例。
using System; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { // 創(chuàng)建MyHttpClient實(shí)例 var httpClient = new MyHttpClient(); // 定義API的URL string apiUrl = "https://jsonplaceholder.typicode.com/posts"; try { // 發(fā)送HTTP GET請求 string response = await httpClient.GetAsync(apiUrl); // 將響應(yīng)內(nèi)容顯示在控制臺 Console.WriteLine("Response from GET request:"); Console.WriteLine(response); // 發(fā)送HTTP POST請求 string postData = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}"; string postResponse = await httpClient.PostAsync(apiUrl, postData); // 將響應(yīng)內(nèi)容顯示在控制臺 Console.WriteLine("Response from POST request:"); Console.WriteLine(postResponse); } catch (HttpRequestException e) { // 處理HTTP請求異常 Console.WriteLine("HTTP Request Error: " + e.Message); } catch (Exception e) { // 處理其他異常 Console.WriteLine("Error: " + e.Message); } } }
4. 代碼注解
HttpClient:
HttpClient
是C#中用于發(fā)送HTTP請求和接收HTTP響應(yīng)的類。它是線程安全的,建議在應(yīng)用程序中重用同一個HttpClient
實(shí)例。HttpRequestMessage: 表示一個HTTP請求消息,包含請求方法(GET、POST等)、請求URI、請求頭、請求內(nèi)容等信息。
HttpResponseMessage: 表示一個HTTP響應(yīng)消息,包含響應(yīng)狀態(tài)碼、響應(yīng)頭、響應(yīng)內(nèi)容等信息。
StringContent: 用于將字符串內(nèi)容作為HTTP請求的內(nèi)容發(fā)送。我們可以指定內(nèi)容的編碼和媒體類型(如
application/json
)。EnsureSuccessStatusCode: 確保HTTP響應(yīng)的狀態(tài)碼表示成功(2xx),否則拋出
HttpRequestException
異常。ReadAsStringAsync: 異步讀取HTTP響應(yīng)的內(nèi)容并返回為字符串。
5. 運(yùn)行結(jié)果
當(dāng)運(yùn)行這個程序時,它會發(fā)送一個GET請求和一個POST請求到https://jsonplaceholder.typicode.com/posts
,并將響應(yīng)內(nèi)容打印到控制臺。GET請求會返回所有的帖子,而POST請求會創(chuàng)建一個新的帖子并返回創(chuàng)建的結(jié)果。
6. 總結(jié)
通過這個抽象類JsonHttpClient
,可以輕松地發(fā)送HTTP請求并處理響應(yīng),而不需要對JSON數(shù)據(jù)進(jìn)行序列化和反序列化操作。這種方法適用于需要直接處理JSON字符串的場景,例如與某些API進(jìn)行交互時。
以上就是基于C#實(shí)現(xiàn)任意格式JSON文本的HTTP交互抽象類的詳細(xì)內(nèi)容,更多關(guān)于C# JSON的HTTP交互抽象類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#通過Win32API設(shè)置客戶端系統(tǒng)時間的方法詳解
在日常工作中,有時可能會需要獲取或修改客戶端電腦的系統(tǒng)時間,比如軟件設(shè)置了Licence有效期,本文以一個簡單的小例子,簡述如何通過C#獲取和設(shè)置客戶端電腦的系統(tǒng)時間,僅供學(xué)習(xí)分享使用,如有不足之處,還請指正,需要的朋友可以參考下2024-06-06C#使用SqlConnection連接到SQL Server的代碼示例
這篇文章主要介紹了C#使用SqlConnection連接到SQL Server的代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03unity3d?對接?workerman?實(shí)現(xiàn)聯(lián)機(jī)游戲功能
workerman?是一款開源高性能?PHP?應(yīng)用容器,他除了用于互聯(lián)網(wǎng)、即時通訊、APP?開發(fā)、硬件通訊、智能家居、物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)外,這篇文章主要介紹了unity3d?對接?workerman?實(shí)現(xiàn)聯(lián)機(jī)游戲,需要的朋友可以參考下2022-10-10C#多線程學(xué)習(xí)之(五)使用定時器進(jìn)行多線程的自動管理
這篇文章主要介紹了C#多線程學(xué)習(xí)之使用定時器進(jìn)行多線程的自動管理,實(shí)例分析了C#使用timer定時器類實(shí)現(xiàn)針對多線程的自動管理功能,非常具有實(shí)用價值,需要的朋友可以參考下2015-04-04深入學(xué)習(xí)C#網(wǎng)絡(luò)編程之HTTP應(yīng)用編程(下)
這篇文章主要介紹了深入學(xué)習(xí)C#網(wǎng)絡(luò)編程之HTTP應(yīng)用編程的相關(guān)知識,文中講解的非常詳細(xì),幫助大家更好的學(xué)習(xí)c#網(wǎng)絡(luò)編程,感興趣的朋友可以了解下2020-06-06C#使用yield關(guān)鍵字讓自定義集合實(shí)現(xiàn)foreach遍歷的方法
這篇文章主要介紹了C#使用yield關(guān)鍵字讓自定義集合實(shí)現(xiàn)foreach遍歷的方法,需要的朋友可以參考下2014-08-08