.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 个精彩案例》 -- 周家安 著