C# HttpClient
在 c# 中 HttpClient
是一个普通的类,用于从 指定 URI 标识的资源发送 HTTP 请求和接收 HTTP 响应。
HTTP request methods
HTTP 定义了一组请求方法,以指示要对给定资源执行的所需操作。
- GET-请求指定资源的表示形式
- HEAD-与GET请求相同,但没有响应主体
- POST-将数据发送到资源,通常会导致状态更改或副作用
- PUT-创建资源或更新现有资源
- DELETE-删除指定的资源
C# HttpClient status code
HTTP响应状态代码表示特定HTTP请求是否已成功完成。响应分为五类:
- Informational responses (100–199)
- Successful responses (200–299)
- Redirects (300–399)
- Client errors (400–499)
- Server errors (500–599)
static async Task Main(string[] args)
{
using var httpClient = new HttpClient();
var result = await httpClient.GetAsync("https://www.baidu.com");
Console.WriteLine(result.StatusCode); // OK
}
以上代码创建了一个对百度网站的 GET 请求,并得到得到了请求结果状态代码200。
C# HttpClient GET request
Get方法用于请求指定资源,Get请求的方法有多种,获取Html
文本,数据流等等。
static async Task Main(string[] args)
{
using var httpClient = new HttpClient();
var content = await httpClient.GetStringAsync("https://www.baidu.com");
Console.WriteLine(content);
}
GetStringAsync 向指定的 Uri 发送GET请求,将响应主体作为字符串返回。
C# HttpClient query strings
Query String
是 URL 的一部分,用于向资源请求添加一些数据。它通常是键/值对的序列,一般都在路径的后边加上?,在后边拼接键值对参数,中间用 & 隔开。
https://www.xxx.com/user/getuserinfo?userid=1
static async Task Main(string[] args)
{
using var httpClient = new HttpClient();
var builder = new UriBuilder("https://www.baidu.com");
builder.Query = "userid=1";
var url = builder.ToString();//https://www.baidu.com?userid=1
var result = await httpClient.GetAsync(url);
var content = result.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
C# HttpClient timeout
要设置请求超时时间,可以使用timeout属性
。
using var httpClient = new HttpClient();
httpClient.Timeout = TimeSpan.FromMinutes(3);
C# HttpClient POST request
HTTP POST
方法将数据发送到服务器,传入的参数类型由Content-type
标头指定。
dotnet new webapi -n TodoAPI
添加Newtonsoft.json
install-package Newtonsoft.json
创建Post请求
static async Task Main(string[] args)
{
var model = new AddStudentDto
{
Id = "1001",
StudentName = "小明"
};
var studentJson = JsonConvert.SerializeObject(model);
var data = new StringContent(studentJson, Encoding.UTF8, "application/json");
using var httpClient = new HttpClient();
var url = "https://localhost:7219/api/Student/addStudent";
var response = await httpClient.PostAsync(url, data);
var result = await response.Content.ReadAsStringAsync();
await Console.Out.WriteLineAsync(result);
}
实例化学生对象并转为json格式,传入StringContent
,并指定编码格式以及数据格式。还可以使用ByteArrayContent
上传文件,如下:
using (var content = new MultipartFormDataContent())
{
var byteArrayContent = new ByteArrayContent(chunkData);
content.Add(byteArrayContent, "pdf", "filename"); // 根据实际情况定义文件名
// 发送分片上传请求
var response = httpClient.PostAsync(uploadUrl, content).Result;
return response;
}
ByteArrayContent
是 StringContent
的父类,通过 ByteArrayContent
可以传递字节数组内容,和 MultipartFormDataContent
搭配使用,多用于上传文件操作。
MultipartFormDataContent
可以处理多部分的表单数据,每个部分都可以有自己的 Content-Type
,适用于发送包含多个不同类型的数据的请求。
ByteArrayContent
更适合发送单一的字节数组作为请求的主体内容,例如发送原始二进制数据。MultipartFormDataContent
是一个容器,可以包含多个不同类型的 HttpContent
(如ByteArrayContent
)以及其他类型的内容,而 ByteArrayContent
只能包含字节数组。
C# HttpClient download image
GetByteArrayAsync
向指定的Uri发送GET请求,并以字节数组的形式返回响应体。
static async Task Main(string[] args)
{
using var httpClient = new HttpClient();
var imgUrl = "https://xxx.xxx.xxx/weather/icon/test.png";
var loaclFilePath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, "Files"));
if (!Directory.Exists(loaclFilePath))
Directory.CreateDirectory(loaclFilePath);
var fileName = "test.png";
var fileResultPath = Path.Combine(loaclFilePath, fileName);
var byteArray = await httpClient.GetByteArrayAsync(imgUrl);
File.WriteAllBytes(fileResultPath, byteArray);
await Console.Out.WriteLineAsync("OK");
}
C# HttpClient streaming
流传输用的比较多,接收到流后可以进行一些相关处理再写入文件,比如生成文件,照片视频等等。
static async Task Main(string[] args)
{
using var httpClient = new HttpClient();
var imgUrl = "https://xxx.xxx.xxx/weather/icon/test.png";
var fileName = Path.GetFileName(imgUrl);
var loaclFilePath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, "Files"));
if (!Directory.Exists(loaclFilePath))
Directory.CreateDirectory(loaclFilePath);
var fileResultPath = Path.Combine(loaclFilePath, fileName);
var result = await httpClient.GetAsync(imgUrl);
using var stream = await result.Content.ReadAsStreamAsync();
using var fs = File.Create(fileResultPath);
await stream.CopyToAsync(fs);
await Console.Out.WriteLineAsync("OK");
}
通过GetAsync
读取uri指定的图片资源,通过ReadAsStreamAsync
读取到流,最后写入文件。