Skip to content

.NET Core 实战 [No.304~305] Http 编程

🏷️ 《.NET Core 实战》

HttpWebRequest & HttpWebResponse

下面的代码示例通过 HttpWebRequestHttpWebResponse 类实现图片下载功能。

  • HttpWebRequest 对象用于向服务器写数据
  • HttpWebResponse 对象用于读取来自服务器的数据

读写数据都是以流(Stream)的方式。

  • 若是向服务器提交数据,则从 HttpWebRequest 对象获取流对象;
  • 若是读取数据,则从 HttpWebResponse 对象获取流对象。
csharp
Console.Write("请输入图片的地址:");
var picUrl = Console.ReadLine();
var imgName = picUrl?.Split('/').LastOrDefault() ?? "default_name.jpg";
HttpWebRequest request = WebRequest.Create(picUrl) as HttpWebRequest;
request.Method = HttpMethod.Get.Method;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
using (Stream respStream = response.GetResponseStream())
using (FileStream fs = new FileStream(imgName, FileMode.Create))
{
    respStream.CopyTo(fs);
}

HttpClient

HttpClient 类封装了 HTTP 通信中的常用操作,为每一种请求定义了对应的方式:

  • GetAsyncGET 方式发送请求。
    HttpClient 还提供了三种不同的 GET 方法:GetByteArrayAsyncGetStreamAsyncGetStringAsync ,只是返回值的类型不同。
  • PostAsyncPOST 方式发送请求。
  • PutAsyncPUT 方式发送请求。
  • DeleteAsyncDELETE 方式发送请求。
  • PatchAsyncPATCH 方式发送请求。
  • SendAsync 发送配置好的 HttpRequestMessage 类型的请求,支持以上述所有的方法发送请求。

下面用 HttpClient 类改写的图片下载处理。

csharp
Console.Write("请输入图片的地址:");
var picUrl = Console.ReadLine();
var imgName = picUrl?.Split('/').LastOrDefault() ?? "default_name.jpg";
using (HttpClient client = new HttpClient())
using (Stream respStream = await client.GetStreamAsync(picUrl))
using (FileStream fs = new FileStream(imgName, FileMode.Create))
{
    await respStream.CopyToAsync(fs);
}

使用 HttpClient 类提交时,其提交的数据正文将由 HttpContent 类封装。在 System.Net.Http 命名空间下提供了如下几种包装方式:

  • ByteArrayContent 包装字节数组。
  • StreamContent 包装流数据。
  • StringContent 包装字符串内容。
  • FormUrlEncodedContent 包装以 application/x-www-form-urlencoded MIME 类型编码过的 键值对元组。常见的 form 表单就是 以这种方式提交的。
  • MultipartContent 包装 HttpContent 的集合,最终会序列化为 multipart/* 内容类型。
  • MultipartFormDataContent 包装 HttpContent 的集合,最终会序列化为 multipart/form-data 内容类型。
  • ReadOnlyMemoryContent 包装 ReadOnlyMemory<byte> 流数据。

下面是使用 StringContent 类包装正文的示例。

csharp
using (HttpClient client = new HttpClient())
{
    StringContent content = new StringContent("佳佳", Encoding.UTF8);
    string url = "https://www.liujiajia.me/api/hello";
    HttpResponseMessage message = await client.PostAsync(url, content);
    string respmsg = await message.Content.ReadAsStringAsync();
    Console.WriteLine($"提交成功,服务器响应消息:{respmsg}");
}

参考:《.NET Core 实战:手把手教你掌握 380 个精彩案例》 -- 周家安 著