C#使用HttpClient發(fā)起HTTP請(qǐng)求的完整指南
1、簡(jiǎn)述
在現(xiàn)代應(yīng)用中,調(diào)用 RESTful API 已成為日常開(kāi)發(fā)中不可或缺的一部分。無(wú)論你在開(kāi)發(fā)桌面程序、Web 服務(wù)還是后臺(tái)任務(wù),HttpClient 都是 .NET 提供的官方網(wǎng)絡(luò)請(qǐng)求利器。
本文將帶你深入了解 HttpClient 的使用方式,并通過(guò)多個(gè)實(shí)踐樣例幫助你快速掌握它。
2、HttpClient 是什么?
HttpClient 是 .NET 中用于發(fā)送 HTTP 請(qǐng)求和接收響應(yīng)的核心類(lèi),屬于命名空間:
using System.Net.Http;
它支持:
- GET / POST / PUT / DELETE 等 HTTP 方法
- 異步請(qǐng)求(基于 async/await)
- 自定義請(qǐng)求頭與內(nèi)容類(lèi)型
- 連接復(fù)用與超時(shí)控制
- JSON 數(shù)據(jù)序列化與反序列化
創(chuàng)建 HttpClient 實(shí)例
最基礎(chǔ)的創(chuàng)建方式如下:
var client = new HttpClient();
但是要注意:
不要在每次請(qǐng)求時(shí) new HttpClient()!
因?yàn)樗鼤?huì)導(dǎo)致連接未及時(shí)釋放,引起端口耗盡問(wèn)題。
正確的做法是:
- 在應(yīng)用生命周期內(nèi) 重用 HttpClient 實(shí)例;
- 或使用 HttpClientFactory(在 ASP.NET Core 中推薦)。
3、實(shí)踐樣例
下面我們從最常見(jiàn)的 GET 與 POST 請(qǐng)求 開(kāi)始。
示例 1:GET 請(qǐng)求
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 會(huì)拒絕訪問(wèn)
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 格式的倉(cāng)庫(kù)信息。
示例 2:POST 請(qǐng)求(發(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# 對(duì)象序列化為 JSON;
- 使用
StringContent設(shè)置請(qǐng)求體; - 指定
Content-Type為application/json。
4、其他常用操作
1、設(shè)置請(qǐng)求頭
client.DefaultRequestHeaders.Add("Authorization", "Bearer your_token_here");
client.DefaultRequestHeaders.Add("Accept", "application/json");
2、PUT / DELETE 請(qǐng)求
// PUT 請(qǐng)求
var putContent = new StringContent("{\"name\":\"Bob\"}", Encoding.UTF8, "application/json");
var putResponse = await client.PutAsync("https://httpbin.org/put", putContent);
// DELETE 請(qǐng)求
var deleteResponse = await client.DeleteAsync("https://httpbin.org/delete");
3、超時(shí)與異常處理
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("請(qǐng)求超時(shí)!");
}
4、反序列化 JSON 響應(yīng)
using System.Text.Json;
var jsonStr = await response.Content.ReadAsStringAsync();
var repoInfo = JsonSerializer.Deserialize<Repo>(jsonStr);
Console.WriteLine($"項(xiàng)目名稱(chēng):{repoInfo.name}");
Console.WriteLine($"Star 數(shù):{repoInfo.stargazers_count}");
class Repo
{
public string name { get; set; }
public int stargazers_count { get; set; }
}
5、天氣查詢(xún)程序
這是一個(gè)實(shí)際的 API 調(diào)用案例,使用 Open-Meteo API 查詢(xún)天氣:
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; }
}
運(yùn)行結(jié)果示例:
當(dāng)前溫度:21.3 °C 風(fēng)速:5.2 km/h
6、HttpClientFactory(進(jìn)階用法)
在 ASP.NET Core 中,推薦使用 IHttpClientFactory 管理 HttpClient 實(shí)例:
// Startup.cs
services.AddHttpClient("GitHub", client =>
{
client.BaseAddress = new Uri("https://api.github.com/");
client.DefaultRequestHeaders.Add("User-Agent", "MyApp");
});
使用時(shí):
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)點(diǎn):
- 自動(dòng)管理連接生命周期;
- 支持命名客戶(hù)端;
- 避免 Socket 耗盡;
- 更易于測(cè)試與擴(kuò)展。
| 功能 | 方法 |
|---|---|
| GET 請(qǐng)求 | GetAsync() |
| POST 請(qǐng)求 | PostAsync() |
| PUT 請(qǐng)求 | PutAsync() |
| DELETE 請(qǐng)求 | DeleteAsync() |
| 添加頭部 | DefaultRequestHeaders.Add() |
| 設(shè)置超時(shí) | client.Timeout |
| 反序列化 JSON | JsonSerializer.Deserialize<T>() |
7、結(jié)語(yǔ)
通過(guò)本文你學(xué)到了:
- 如何在 C# 中使用 HttpClient 發(fā)起各種 HTTP 請(qǐng)求;
- 如何發(fā)送 JSON、處理響應(yīng)與異常;
- 如何在實(shí)際項(xiàng)目中使用 HttpClientFactory 優(yōu)化性能。
建議:在生產(chǎn)環(huán)境中,始終重用 HttpClient 或使用 IHttpClientFactory,并注意請(qǐng)求超時(shí)與重試機(jī)制。
以上就是C#使用HttpClient發(fā)起HTTP請(qǐng)求的完整指南的詳細(xì)內(nèi)容,更多關(guān)于C# HttpClient發(fā)起HTTP請(qǐng)求的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于C#實(shí)現(xiàn)手機(jī)號(hào)碼歸屬地接口調(diào)用
這篇文章主要介紹了基于C#實(shí)現(xiàn)手機(jī)號(hào)碼歸屬地接口調(diào)用的相關(guān)資料,需要的朋友可以參考下2016-02-02
c#和javascript函數(shù)相互調(diào)用示例分享
在webBrowser使用過(guò)程中為了C#和JS通訊,webBrowser必須設(shè)置ObjectForScripting的屬性,它是一個(gè)object,這個(gè)object可以提供給webBrowser控件載入的網(wǎng)頁(yè)上的script訪問(wèn)2014-01-01
C#生成設(shè)置范圍內(nèi)的Double類(lèi)型隨機(jī)數(shù)的方法
這篇文章主要介紹了C#生成設(shè)置范圍內(nèi)的Double類(lèi)型隨機(jī)數(shù)的方法,對(duì)于C#的初學(xué)者有很好的借鑒價(jià)值,需要的朋友可以參考下2014-08-08
C#.NET采用HTML模板發(fā)送電子郵件完整實(shí)例
這篇文章主要介紹了C#.NET采用HTML模板發(fā)送電子郵件的方法,主要包括了HTML模板、替換函數(shù)與郵件函數(shù)三部分,是非常實(shí)用的功能,需要的朋友可以參考下2014-09-09
MessageBox的Buttons和三級(jí)聯(lián)動(dòng)效果
這篇文章主要介紹了MessageBox的Buttons和三級(jí)聯(lián)動(dòng)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11

