C# HttpClient

430 阅读3分钟

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;
}

ByteArrayContentStringContent 的父类,通过 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读取到流,最后写入文件。