基于C#實(shí)現(xiàn)任意格式JSON文本的HTTP交互抽象類(lèi)
引言
為了實(shí)現(xiàn)一個(gè)支持任意格式JSON交互的抽象類(lèi),并且在整個(gè)過(guò)程中不需要對(duì)JSON格式數(shù)據(jù)進(jìn)行序列化和反序列化操作,可以使用C#中的HttpClient類(lèi)來(lái)進(jìn)行HTTP請(qǐng)求和響應(yīng)。下面將創(chuàng)建一個(gè)抽象類(lèi)JsonHttpClient,它封裝了HTTP請(qǐng)求和響應(yīng)的邏輯,并且允許直接處理JSON字符串。
1. 創(chuàng)建抽象類(lèi) JsonHttpClient
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
public abstract class JsonHttpClient
{
// HttpClient實(shí)例,用于發(fā)送HTTP請(qǐng)求
private readonly HttpClient _httpClient;
// 構(gòu)造函數(shù),初始化HttpClient
protected JsonHttpClient()
{
_httpClient = new HttpClient();
}
// 發(fā)送HTTP請(qǐng)求的抽象方法,子類(lèi)必須實(shí)現(xiàn)
protected abstract Task<HttpResponseMessage> SendRequestAsync(HttpRequestMessage request);
// 發(fā)送HTTP GET請(qǐng)求
public async Task<string> GetAsync(string uri)
{
// 創(chuàng)建HTTP GET請(qǐng)求
var request = new HttpRequestMessage(HttpMethod.Get, uri);
// 發(fā)送請(qǐng)求并獲取響應(yīng)
var response = await SendRequestAsync(request);
// 確保響應(yīng)成功
response.EnsureSuccessStatusCode();
// 讀取響應(yīng)內(nèi)容并返回
return await response.Content.ReadAsStringAsync();
}
// 發(fā)送HTTP POST請(qǐng)求
public async Task<string> PostAsync(string uri, string jsonContent)
{
// 創(chuàng)建HTTP POST請(qǐng)求
var request = new HttpRequestMessage(HttpMethod.Post, uri)
{
Content = new StringContent(jsonContent, Encoding.UTF8, "application/json")
};
// 發(fā)送請(qǐng)求并獲取響應(yīng)
var response = await SendRequestAsync(request);
// 確保響應(yīng)成功
response.EnsureSuccessStatusCode();
// 讀取響應(yīng)內(nèi)容并返回
return await response.Content.ReadAsStringAsync();
}
// 發(fā)送HTTP PUT請(qǐng)求
public async Task<string> PutAsync(string uri, string jsonContent)
{
// 創(chuàng)建HTTP PUT請(qǐng)求
var request = new HttpRequestMessage(HttpMethod.Put, uri)
{
Content = new StringContent(jsonContent, Encoding.UTF8, "application/json")
};
// 發(fā)送請(qǐng)求并獲取響應(yīng)
var response = await SendRequestAsync(request);
// 確保響應(yīng)成功
response.EnsureSuccessStatusCode();
// 讀取響應(yīng)內(nèi)容并返回
return await response.Content.ReadAsStringAsync();
}
// 發(fā)送HTTP DELETE請(qǐng)求
public async Task<string> DeleteAsync(string uri)
{
// 創(chuàng)建HTTP DELETE請(qǐng)求
var request = new HttpRequestMessage(HttpMethod.Delete, uri);
// 發(fā)送請(qǐng)求并獲取響應(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客戶(hù)端類(lèi)
可以創(chuàng)建一個(gè)具體的HTTP客戶(hù)端類(lèi),繼承自JsonHttpClient,并實(shí)現(xiàn)SendRequestAsync方法。
public class MyHttpClient : JsonHttpClient
{
// 實(shí)現(xiàn)SendRequestAsync方法
protected override async Task<HttpResponseMessage> SendRequestAsync(HttpRequestMessage request)
{
// 使用HttpClient發(fā)送請(qǐng)求并返回響應(yīng)
return await _httpClient.SendAsync(request);
}
}
3. 使用案例
下面是一個(gè)從發(fā)送HTTP請(qǐng)求到獲取響應(yīng)并顯示在控制臺(tái)的完整案例。
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請(qǐng)求
string response = await httpClient.GetAsync(apiUrl);
// 將響應(yīng)內(nèi)容顯示在控制臺(tái)
Console.WriteLine("Response from GET request:");
Console.WriteLine(response);
// 發(fā)送HTTP POST請(qǐng)求
string postData = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";
string postResponse = await httpClient.PostAsync(apiUrl, postData);
// 將響應(yīng)內(nèi)容顯示在控制臺(tái)
Console.WriteLine("Response from POST request:");
Console.WriteLine(postResponse);
}
catch (HttpRequestException e)
{
// 處理HTTP請(qǐng)求異常
Console.WriteLine("HTTP Request Error: " + e.Message);
}
catch (Exception e)
{
// 處理其他異常
Console.WriteLine("Error: " + e.Message);
}
}
}
4. 代碼注解
HttpClient:
HttpClient是C#中用于發(fā)送HTTP請(qǐng)求和接收HTTP響應(yīng)的類(lèi)。它是線程安全的,建議在應(yīng)用程序中重用同一個(gè)HttpClient實(shí)例。HttpRequestMessage: 表示一個(gè)HTTP請(qǐng)求消息,包含請(qǐng)求方法(GET、POST等)、請(qǐng)求URI、請(qǐng)求頭、請(qǐng)求內(nèi)容等信息。
HttpResponseMessage: 表示一個(gè)HTTP響應(yīng)消息,包含響應(yīng)狀態(tài)碼、響應(yīng)頭、響應(yīng)內(nèi)容等信息。
StringContent: 用于將字符串內(nèi)容作為HTTP請(qǐng)求的內(nèi)容發(fā)送。我們可以指定內(nèi)容的編碼和媒體類(lè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)行這個(gè)程序時(shí),它會(huì)發(fā)送一個(gè)GET請(qǐng)求和一個(gè)POST請(qǐng)求到https://jsonplaceholder.typicode.com/posts,并將響應(yīng)內(nèi)容打印到控制臺(tái)。GET請(qǐng)求會(huì)返回所有的帖子,而POST請(qǐng)求會(huì)創(chuàng)建一個(gè)新的帖子并返回創(chuàng)建的結(jié)果。
6. 總結(jié)
通過(guò)這個(gè)抽象類(lèi)JsonHttpClient,可以輕松地發(fā)送HTTP請(qǐng)求并處理響應(yīng),而不需要對(duì)JSON數(shù)據(jù)進(jìn)行序列化和反序列化操作。這種方法適用于需要直接處理JSON字符串的場(chǎng)景,例如與某些API進(jìn)行交互時(shí)。
以上就是基于C#實(shí)現(xiàn)任意格式JSON文本的HTTP交互抽象類(lèi)的詳細(xì)內(nèi)容,更多關(guān)于C# JSON的HTTP交互抽象類(lèi)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#監(jiān)聽(tīng)txt文檔獲取新數(shù)據(jù)方式
文章介紹通過(guò)監(jiān)聽(tīng)txt文件獲取最新數(shù)據(jù),并實(shí)現(xiàn)開(kāi)機(jī)自啟動(dòng)、禁用窗口關(guān)閉按鈕、阻止Ctrl+C中斷及防止程序退出等功能,代碼整合于主函數(shù)中,供參考學(xué)習(xí)2025-07-07
C#進(jìn)行PDF表單域的創(chuàng)建填寫(xiě)與刪除操作
通常情況下,PDF文件是不可編輯的,但PDF表單提供了一些可編輯區(qū)域,允許用戶(hù)填寫(xiě)和提交信息,本文主要介紹了如何使用C#實(shí)現(xiàn)PDF表單域的創(chuàng)建,填寫(xiě)與刪除操作,感興趣的可以了解下2024-04-04
C#實(shí)現(xiàn)語(yǔ)音播報(bào)功能的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)語(yǔ)音播報(bào)功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-02-02
TextBox獲取輸入焦點(diǎn)時(shí)自動(dòng)全選的實(shí)現(xiàn)方法
TextBox獲取輸入焦點(diǎn)時(shí)自動(dòng)全選的實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-03-03

