C#使用HttpClient發(fā)起HTTP請求的完整指南
1、簡述
在現(xiàn)代應(yīng)用中,調(diào)用 RESTful API 已成為日常開發(fā)中不可或缺的一部分。無論你在開發(fā)桌面程序、Web 服務(wù)還是后臺任務(wù),HttpClient 都是 .NET 提供的官方網(wǎng)絡(luò)請求利器。
本文將帶你深入了解 HttpClient 的使用方式,并通過多個實踐樣例幫助你快速掌握它。
2、HttpClient 是什么?
HttpClient 是 .NET 中用于發(fā)送 HTTP 請求和接收響應(yīng)的核心類,屬于命名空間:
using System.Net.Http;
它支持:
- GET / POST / PUT / DELETE 等 HTTP 方法
- 異步請求(基于 async/await)
- 自定義請求頭與內(nèi)容類型
- 連接復(fù)用與超時控制
- JSON 數(shù)據(jù)序列化與反序列化
創(chuàng)建 HttpClient 實例
最基礎(chǔ)的創(chuàng)建方式如下:
var client = new HttpClient();
但是要注意:
不要在每次請求時 new HttpClient()!
因為它會導(dǎo)致連接未及時釋放,引起端口耗盡問題。
正確的做法是:
- 在應(yīng)用生命周期內(nèi) 重用 HttpClient 實例;
- 或使用 HttpClientFactory(在 ASP.NET Core 中推薦)。
3、實踐樣例
下面我們從最常見的 GET 與 POST 請求 開始。
示例 1:GET 請求
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
var url = "https://api.github.com/repos/dotnet/runtime";
// 設(shè)置 User-Agent,否則 GitHub API 會拒絕訪問
client.DefaultRequestHeaders.Add("User-Agent", "CSharpHttpClientDemo");
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode(); // 確保狀態(tài)碼 200-299
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine("返回內(nèi)容:");
Console.WriteLine(content);
}
}
輸出為 JSON 格式的倉庫信息。
示例 2:POST 請求(發(fā)送 JSON 數(shù)據(jù))
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Text.Json;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
var url = "https://httpbin.org/post";
var data = new { Name = "Alice", Age = 25 };
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine("響應(yīng)內(nèi)容:");
Console.WriteLine(result);
}
}
該示例演示了如何:
- 將 C# 對象序列化為 JSON;
- 使用
StringContent設(shè)置請求體; - 指定
Content-Type為application/json。
4、其他常用操作
1、設(shè)置請求頭
client.DefaultRequestHeaders.Add("Authorization", "Bearer your_token_here");
client.DefaultRequestHeaders.Add("Accept", "application/json");
2、PUT / DELETE 請求
// PUT 請求
var putContent = new StringContent("{\"name\":\"Bob\"}", Encoding.UTF8, "application/json");
var putResponse = await client.PutAsync("https://httpbin.org/put", putContent);
// DELETE 請求
var deleteResponse = await client.DeleteAsync("https://httpbin.org/delete");
3、超時與異常處理
client.Timeout = TimeSpan.FromSeconds(10);
try
{
var response = await client.GetAsync("https://slowwly.robertomurray.co.uk/delay/5000/url/http://example.com");
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
catch (TaskCanceledException)
{
Console.WriteLine("請求超時!");
}
4、反序列化 JSON 響應(yīng)
using System.Text.Json;
var jsonStr = await response.Content.ReadAsStringAsync();
var repoInfo = JsonSerializer.Deserialize<Repo>(jsonStr);
Console.WriteLine($"項目名稱:{repoInfo.name}");
Console.WriteLine($"Star 數(shù):{repoInfo.stargazers_count}");
class Repo
{
public string name { get; set; }
public int stargazers_count { get; set; }
}
5、天氣查詢程序
這是一個實際的 API 調(diào)用案例,使用 Open-Meteo API 查詢天氣:
using System;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
string url = "https://api.open-meteo.com/v1/forecast?latitude=35&longitude=139¤t_weather=true";
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
var weather = JsonSerializer.Deserialize<WeatherResponse>(json);
Console.WriteLine($"當(dāng)前溫度:{weather.current_weather.temperature} °C");
Console.WriteLine($"風(fēng)速:{weather.current_weather.windspeed} km/h");
}
}
class WeatherResponse
{
public CurrentWeather current_weather { get; set; }
}
class CurrentWeather
{
public double temperature { get; set; }
public double windspeed { get; set; }
}
運行結(jié)果示例:
當(dāng)前溫度:21.3 °C 風(fēng)速:5.2 km/h
6、HttpClientFactory(進(jìn)階用法)
在 ASP.NET Core 中,推薦使用 IHttpClientFactory 管理 HttpClient 實例:
// Startup.cs
services.AddHttpClient("GitHub", client =>
{
client.BaseAddress = new Uri("https://api.github.com/");
client.DefaultRequestHeaders.Add("User-Agent", "MyApp");
});
使用時:
public class GitHubService
{
private readonly HttpClient _client;
public GitHubService(IHttpClientFactory factory)
{
_client = factory.CreateClient("GitHub");
}
public async Task<string> GetRepoAsync(string name)
{
var response = await _client.GetAsync($"repos/{name}");
return await response.Content.ReadAsStringAsync();
}
}
優(yōu)點:
- 自動管理連接生命周期;
- 支持命名客戶端;
- 避免 Socket 耗盡;
- 更易于測試與擴(kuò)展。
| 功能 | 方法 |
|---|---|
| GET 請求 | GetAsync() |
| POST 請求 | PostAsync() |
| PUT 請求 | PutAsync() |
| DELETE 請求 | DeleteAsync() |
| 添加頭部 | DefaultRequestHeaders.Add() |
| 設(shè)置超時 | client.Timeout |
| 反序列化 JSON | JsonSerializer.Deserialize<T>() |
7、結(jié)語
通過本文你學(xué)到了:
- 如何在 C# 中使用 HttpClient 發(fā)起各種 HTTP 請求;
- 如何發(fā)送 JSON、處理響應(yīng)與異常;
- 如何在實際項目中使用 HttpClientFactory 優(yōu)化性能。
建議:在生產(chǎn)環(huán)境中,始終重用 HttpClient 或使用 IHttpClientFactory,并注意請求超時與重試機(jī)制。
以上就是C#使用HttpClient發(fā)起HTTP請求的完整指南的詳細(xì)內(nèi)容,更多關(guān)于C# HttpClient發(fā)起HTTP請求的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#中Equals和GetHashCode使用及區(qū)別
這篇文章主要介紹了C#中Equals和GetHashCode使用及區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
C# DataTable.Select()根據(jù)條件篩選數(shù)據(jù)問題
這篇文章主要介紹了C# DataTable.Select()根據(jù)條件篩選數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
C#中將UTC時間轉(zhuǎn)換為JST時間的實現(xiàn)方法
在C#中,將UTC時間轉(zhuǎn)換為JST(日本標(biāo)準(zhǔn)時間,即UTC+9)時間可以通過使用 DateTime 和 TimeZoneInfo 類來實現(xiàn),JST比UTC快9小時,因此可以直接進(jìn)行轉(zhuǎn)換,本文將通過代碼示例給大家介紹C#中將UTC時間轉(zhuǎn)換為JST時間,需要的朋友可以參考下2025-01-01
C# 使用multipart form-data方式post數(shù)據(jù)到服務(wù)器
這篇文章主要介紹了C# 使用multipart form-data方式post數(shù)據(jù)到服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Unity調(diào)取移動端的麥克風(fēng)進(jìn)行錄音并播放
這篇文章主要為大家詳細(xì)介紹了Unity調(diào)取移動端的麥克風(fēng)進(jìn)行錄音并播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06

