.NET Core 实战 [No.304~305] Http 编程
HttpWebRequest & HttpWebResponse
下面的代码示例通过 HttpWebRequest
和 HttpWebResponse
类实现图片下载功能。
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 通信中的常用操作,为每一种请求定义了对应的方式:
- GetAsync 以 GET 方式发送请求。
HttpClient
还提供了三种不同的 GET 方法:GetByteArrayAsync、GetStreamAsync 和 GetStringAsync ,只是返回值的类型不同。 - PostAsync 以 POST 方式发送请求。
- PutAsync 以 PUT 方式发送请求。
- DeleteAsync 以 DELETE 方式发送请求。
- PatchAsync 以 PATCH 方式发送请求。
- 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 个精彩案例》 -- 周家安 著