这里引入微软官方提供的HttpClient类来实现我们的目的。
首先,介绍一下官方HttpClient类的内容。
HttpClient 类
定义
命名空间:
System.Net.Http
程序集:
System.Net.Http.dll
Source:
HttpClient.cs
提供一个类,用于从 URI 标识的资源发送 HTTP 请求和接收 HTTP 响应。
public class HttpClient : System.Net.Http.HttpMessageInvoker
继承
Object - > HttpMessageInvoker - > HttpClient
示例:
// HttpClient is intended to be instantiated once per application, rather than per-use. See Remarks.
static readonly HttpClient client = new HttpClient();
static async Task Main()
{
// Call asynchronous network methods in a try/catch block to handle exceptions.
try
{
using HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/");
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
// Above three lines can be replaced with new helper method below
// string responseBody = await client.GetStringAsync(uri);
Console.WriteLine(responseBody);
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
}
}
构造函数
函数 | 描述 |
---|---|
HttpClient() | 使用释放此实例时释放的 HttpClientHandler 初始化 HttpClient 类的新实例。 |
HttpClient(HttpMessageHandler) | 使用指定的处理程序初始化 HttpClient 类的新实例。 处理程序在释放此实例时被释放。 |
HttpClient(HttpMessageHandler, Boolean) | 使用提供的处理程序初始化 HttpClient 类的新实例,并指定在释放此实例时是否应释放该处理程序。 |
属性
属性 | 描述 |
---|---|
BaseAddress | 获取或设置发送请求时使用的 Internet 资源的统一资源标识符 (URI) 的基址。 |
DefaultProxy | 获取或设置全局 HTTP 代理。 |
DefaultRequestHeaders | 获取与每个请求一起发送的标题。 |
DefaultRequestVersion | 获取或设置对此 HttpClient 实例发出的后续请求使用的默认 HTTP 版本。 |
DefaultVersionPolicy | 获取或设置便捷方法中隐式创建的请求的默认版本策略,例如 GetAsync(String) 和 PostAsync(String, HttpContent)。 |
MaxResponseContentBufferSize | 获取或设置读取响应内容时要缓冲的最大字节数。 |
Timeout | 获取或设置请求超时前等待的时间跨度。 |
方法
方法 | 描述 |
---|---|
CancelPendingRequests() | 取消该实例所有挂起的请求。 |
DeleteAsync(String) | 以异步操作将 DELETE 请求发送给指定 URI。 |
DeleteAsync(String, CancellationToken) | 用以异步操作的取消标记发送 DELETE 请求到指定的 URI。 |
DeleteAsync(Uri) | 以异步操作将 DELETE 请求发送给指定 URI。 |
DeleteAsync(Uri, CancellationToken) | 用以异步操作的取消标记发送 DELETE 请求到指定的 URI。 |
Dispose() | 释放由 HttpMessageInvoker 使用的非托管资源和托管资源。 |
Dispose(Boolean) | 释放由 HttpClient 使用的非托管资源,并可根据需要释放托管资源。 |
Equals(Object) | 确定指定对象是否等于当前对象。 |
GetAsync(String) | 以异步操作将 GET 请求发送给指定 URI。 |
GetAsync(String, CancellationToken) | 用以异步操作的取消标记发送 GET 请求到指定的 URI。 |
GetAsync(String, HttpCompletionOption) | 用以异步操作的 HTTP 完成选项发送 GET 请求到指定的 URI。 |
GetAsync(String, HttpCompletionOption, CancellationToken) | 用以异步操作的 HTTP 完成选项和取消标记发送 GET 请求到指定的 URI。 |
GetAsync(Uri) | 以异步操作将 GET 请求发送给指定 URI。 |
GetAsync(Uri, CancellationToken) | 用以异步操作的取消标记发送 GET 请求到指定的 URI。 |
GetAsync(Uri, HttpCompletionOption) | 用以异步操作的 HTTP 完成选项发送 GET 请求到指定的 URI。 |
GetAsync(Uri, HttpCompletionOption, CancellationToken) | 用以异步操作的 HTTP 完成选项和取消标记发送 GET 请求到指定的 URI。 |
GetByteArrayAsync(String) | 将 GET 请求发送到指定 URI 并在异步操作中以字节数组的形式返回响应正文。 |
GetByteArrayAsync(String, CancellationToken) | 将 GET 请求发送到指定 URI 并在异步操作中以字节数组的形式返回响应正文。 |
GetByteArrayAsync(Uri) | 将 GET 请求发送到指定 URI 并在异步操作中以字节数组的形式返回响应正文。 |
GetByteArrayAsync(Uri, CancellationToken) | 将 GET 请求发送到指定 URI 并在异步操作中以字节数组的形式返回响应正文。 |
GetHashCode() | 作为默认哈希函数。 |
GetStreamAsync(String) | 将 GET 请求发送到指定 URI 并在异步操作中以流的形式返回响应正文。 |
GetStreamAsync(String, CancellationToken) | 将 GET 请求发送到指定 URI 并在异步操作中以流的形式返回响应正文。 |
GetStreamAsync(Uri) | 将 GET 请求发送到指定 URI 并在异步操作中以流的形式返回响应正文。 |
GetStreamAsync(Uri, CancellationToken) | 将 GET 请求发送到指定 URI 并在异步操作中以流的形式返回响应正文。 |
GetStringAsync(String) | 将 GET 请求发送到指定 URI 并在异步操作中以字符串的形式返回响应正文。 |
GetStringAsync(String, CancellationToken) | 将 GET 请求发送到指定 URI 并在异步操作中以字符串的形式返回响应正文。 |
GetStringAsync(Uri) | 将 GET 请求发送到指定 URI 并在异步操作中以字符串的形式返回响应正文。 |
GetStringAsync(Uri, CancellationToken) | 将 GET 请求发送到指定 URI 并在异步操作中以字符串的形式返回响应正文。 |
GetType() | 获取当前实例的 Type。 |
MemberwiseClone() | 创建当前 Object 的浅表副本。 |
PatchAsync(String, HttpContent) | 以异步操作方式将 PATCH 请求发送到指定为字符串的 URI。 |
PatchAsync(String, HttpContent, CancellationToken) | 以异步操作方式将带有取消令牌的 PATCH 请求发送到表示为字符串的 URI。 |
PatchAsync(Uri, HttpContent) | 以异步操作方式发送 PATCH 请求。 |
PatchAsync(Uri, HttpContent, CancellationToken) | 以异步操作方式发送带有取消令牌的 PATCH 请求。 |
PostAsync(String, HttpContent) | 以异步操作将 POST 请求发送给指定 URI。 |
PostAsync(String, HttpContent, CancellationToken) | 用以异步操作的取消标记发送 POST 请求。 |
PostAsync(Uri, HttpContent) | 以异步操作将 POST 请求发送给指定 URI。 |
PostAsync(Uri, HttpContent, CancellationToken) | 用以异步操作的取消标记发送 POST 请求。 |
PutAsync(String, HttpContent) | 以异步操作将 PUT 请求发送给指定 URI。 |
PutAsync(String, HttpContent, CancellationToken) | 用以异步操作的取消标记发送 PUT 请求。 |
PutAsync(Uri, HttpContent) | 以异步操作将 PUT 请求发送给指定 URI。 |
PutAsync(Uri, HttpContent, CancellationToken) | 用以异步操作的取消标记发送 PUT 请求。 |
Send(HttpRequestMessage) | 发送带有指定请求的 HTTP 请求。 |
Send(HttpRequestMessage, CancellationToken) | 发送带有指定请求和取消标记的 HTTP 请求。 |
Send(HttpRequestMessage, HttpCompletionOption) | 发送 HTTP 请求。 |
Send(HttpRequestMessage, HttpCompletionOption, CancellationToken) | 发送带有指定请求、完成选项和取消标记的 HTTP 请求。 |
SendAsync(HttpRequestMessage) | 以异步操作发送 HTTP 请求。 |
SendAsync(HttpRequestMessage, CancellationToken) | 以异步操作发送 HTTP 请求。 |
SendAsync(HttpRequestMessage, HttpCompletionOption) | 以异步操作发送 HTTP 请求。 |
SendAsync(HttpRequestMessage, HttpCompletionOption, CancellationToken) 以异步操作发送 HTTP 请求。 | |
ToString() 返回表示当前对象的字符串。 |
案例
在工程中创建一个Http消息类 HttpMessage,并在这个类中分别实现Http的Get、Post、Push和Delete方法。
异步任务Get
public async Task<string> GetAsync<T>(string path)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("Your Uri");
HttpResponseMessage response = await client.GetAsync(path);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
return content;
}
throw new Exception($"Error getting data from API: {response.StatusCode}");
}
异步任务Post
public async Task<T> PostAsync<T>(string path, object content)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("Your Uri");
string jsonContent = JsonConvert.SerializeObject(content);
StringContent stringContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync(path, stringContent);
if (response.IsSuccessStatusCode)
{
string result = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(result);
}
throw new HttpRequestException($"Error posting data to API: {response.StatusCode}");
}
异步任务Put
public async Task<HttpResponseMessage> PutAsync(string path, object content)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("Your Uri");
string jsonContent = JsonConvert.SerializeObject(content);
StringContent stringContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PutAsync(path, stringContent);
return response;
}
异步任务Delete
public async Task<HttpResponseMessage> DeleteAsync(string path)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("Your Uri");
HttpResponseMessage response = await client.DeleteAsync(path);
return response;
}
响应类型
// 响应类型
public class MyResponseType
{
public string Message { get; set; }
// 其他属性...
}
根据以方法,可以通过C#实现网络的Http消息收发机制。