佳佳的博客
Menu
首页
《.NET Core 实战》 [No.304~305] Http 编程
Posted by
佳佳
on 2020-03-30
IT
C#
.NET Core
《.NET Core 实战》
读书笔记
<!-- # 《.NET Core 实战》 [No.304~305] Http 编程 --> <!-- dotnet-core-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个精彩案例》][10] -- *周家安* 著 --- [10]:https://union-click.jd.com/jdc?e=&p=AyIGZRhaEwAQBFUZXBIyEgRSEl0QCxc3EUQDS10iXhBeGlcJDBkNXg9JHU4YDk5ER1xOGRNLGEEcVV8BXURFUFdfC0RVU1JRUy1OVxUBFQ5THlIQMm1AEkRdb11GZyNTK0BBZwYIbylWcHILWStaJQITBlYbXB0LFQJlK1sSMkBpja3tzaejG4Gx1MCKhTdUK1sRCxQBVxtTEQIQBlwrXBULIloNXwZBXUReEStrJQEiN2UbaxYyUGlUG1kUBhcGUBILQgUXDlMeUkBVRlUBS10XBkIABhkJRzIQBlQfUg%3D%3D (《.NET Core实战:手把手教你掌握380个精彩案例》)
版权声明:原创文章,未经允许不得转载。
https://www.liujiajia.me/2020/3/30/dotnet-core-http
“Buy me a nongfu spring”
« 《.NET Core 实战》 [No.306~312] 反射
《.NET Core 实战》 [No.301~303] Socket 通信 »
昵称
*
电子邮箱
*
回复内容
*
(回复审核后才会显示)
提交
目录
AUTHOR
刘佳佳
江苏 - 苏州
软件工程师
梦嘉集团