[深入浅出WP8.1(Runtime)]网络编程之HttpClient类
12.2 网络编程之HttpClient类
除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现。对于基本的请求操作,HttpClient类提供了一个简单的接口来处理最常见的任务,并为身份验证提供了适用于大多数方案的合理的默认设置。对于较为复杂的 HTTP 操作,更多的功能包括:执行常见操作(DELETE、GET、PUT 和 POST)的方法;获取、设置和删除 Cookie 的功能;支持常见的身份验证设置和模式;异步方法上提供的 HTTP 请求进度信息;访问有关传输的安全套接字层 (SSL) 详细信息;在高级应用中包含自定义筛选器的功能等。
12.2.1 Get请求获取字符串和数据流数据
(1)获取字符串数据
HttpClient类使用基于任务的异步模式提供了非常简化的请求操作,你可以直接调用HttpClient类GetStringAsync方法便可以获取到网络返回的字符串数据。下面我们来看一下使用Get请求来获取网络返回的字符串,实现的代码很简洁和简单,示例代码如下所示:
Uri uri = new Uri("http://yourwebsite.com"); HttpClient httpClient = new HttpClient(); // 获取网络的返回的字符串数据 string result = await httpClient.GetStringAsync (uri);
使用GetStringAsync方法是一种简化的HTTP请求,如果我们要获取到HTTP请求所返回的整个对象HttpResponseMessage类对象可以使用GetAsync方法。HttpResponseMessage对象是HTTP的相应消息对象,它包含了网络请求相应的HTTP头、数据体等信息。下面我们使用GetAsync方法来获取网络返回的字符串信息,示例代码如下所示:
HttpResponseMessage response = await httpClient.GetAsync(uri); string responseBody = await response.Content.ReadAsStringAsync();
(2)获取数据流数据
HttpResponseMessage对象的Content属性表示是返回的数据对象,是一个IHttpContent类型的对象。如果要获取的是数据流数据,可以通过它的ReadAsBufferAsync方法获取到返回的IBuffer对象,或者通过ReadAsInputStreamAsync地方获取IInputStream对象,然后再转化为Stream对象,示例代码如下所示:
using (Stream responseStream = (await response.Content.ReadAsInputStreamAsync()).AsStreamForRead()) { int read = ; byte[] responseBytes = new byte[]; do { // 如果read等于0表示Stream的数据以及读取完毕 read = await responseStream.ReadAsync(responseBytes, , responseBytes.Length); } while (read != ); }
(3)取消网络请求
HttpClient类发起的网络请求都是基于任务的异步方法,所以要取消其异步的操作可以通过异步任务的取消对象CancellationTokenSource对象来取消,这点和HttpWebRequest类是不同。如果使用CancellationTokenSource对象来取消异步的请求会触发TaskCanceledException异常,这个异常需要我们用try catch语句来捕获,便可以识别到请求是被取消的。
private CancellationTokenSource cts = new CancellationTokenSource(); try { // 使用CancellationTokenSource对象来控制异步任务的取消操作 HttpResponseMessage response = await httpClient.GetAsync(new Uri(resourceAddress)).AsTask(cts.Token); responseBody = await response.Content.ReadAsStringAsync().AsTask(cts.Token); cts.Token.ThrowIfCancellationRequested(); } catch (TaskCanceledException) { responseBody = "请求被取消"; } // 调用Cancel方法取消网络请求 if (cts.Token.CanBeCanceled) { cts.Cancel(); }
12.2.2 Post请求发送字符串和数据流数据
使用HttpClient类发起Post请求的编程方式也很简洁,我们可以调用方法PostAsync(Uri uri, IHttpContent content)来直接向目标的地址Post数据,在该方法里面有两个参数其中uri就是网络的目标地址,两外一个content是指你要向目标地址Post的数据对象。在Post数据之前我们首先把我们的数据初始化成为一个IHttpContent对象,那么实现了IHttpContent接口的类有HttpStringContent类、HttpStreamContent类和HttpBufferContent类,这三个类分表代表了字符串类型、数据流类型和二进制类型,那么数据流类型和二进制类型是可以互相转换的区别不大。调用PostAsync方法之后会返回一个HttpResponseMessage对象,通过这个HTTP的相应消息对象我们就可以获取Post请求之后的返回的结果信息。Post请求发送字符串和数据流数据的代码示例如下所示:
(1)Post请求发送字符串数据
HttpStringContent httpStringContent = new HttpStringContent("hello Windows Phone"); HttpResponseMessage response = await httpClient.PostAsync(uri, httpStringContent).AsTask(cts.Token); string responseBody = await response.Content.ReadAsStringAsync().AsTask(cts.Token);
(2)Post请求发送数据流数据
HttpStreamContent streamContent = new HttpStreamContent(stream.AsInputStream()); HttpResponseMessage response = await httpClient.PostAsync(uri, streamContent).AsTask(cts.Token); string responseBody = await response.Content.ReadAsStringAsync().AsTask(cts.Token);
除了使用PostAsync方法之外,我们还可以使用SendRequestAsync方法来发送网络请求,SendRequestAsync方法既可以使用Get方式也可以使用Post方式。SendRequestAsync方法发送的消息类型是HttpRequestMessage类对象,HttpRequestMessage类表示HTTP的请求消息类,你可以通过HttpRequestMessage对象设置请求的类型(Get/Post)和传输的数据对象。使用SendRequestAsync方法的代码示例如下所示:
// 创建HttpRequestMessage对象 HttpStreamContent streamContent = new HttpStreamContent(stream.AsInputStream()); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri(resourceAddress)); request.Content = streamContent; // 发送数据 HttpResponseMessage response = await httpClient.SendRequestAsync(request).AsTask(cts.Token); string responseBody = await response.Content.ReadAsStringAsync().AsTask(cts.Token);
12.2.3 设置和获取Cookie
Cookie是指某些网站为了辨别用户身份、进行回话跟踪而储存在用户本地终端上的数据(通常经过加密)。那么当我们在使用HTTP请求的时候,如果服务器返回的数据待用Cookie数据,我们也是可以获取出来,存储在本地,下次发起HTTP请求的时候就会带上这些Cookie的数据。
在HttpClient类的网络请求中我们可以通过HttpBaseProtocolFilter类来获取网站的Cookie信息,HttpBaseProtocolFilter类表示是HttpClient的HTTP请求的基础协议的过滤器。获取Cookie的代码示例如下所示:
// 创建一个HttpBaseProtocolFilter对象 HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter(); // 通过HttpBaseProtocolFilter对象获取使用HttpClient进行过网络请求的地址的Cookie信息 HttpCookieCollection cookieCollection = filter.CookieManager.GetCookies(new Uri(resourceAddress)); // 遍历整个Cookie集合的Cookie信息 foreach (HttpCookie cookie in cookieCollection) { }
当然我们在发送HTTP请求的时候也一样可以带上Cookie信息,如果服务器可以识别到Cookie信息那么就会通过Cookie信息来进行一些操作,比如Cookie信息信息带有用户名和密码的加密信息,那么就可以免去登陆的步骤。在HttpClient的网路请求里面HttpCookie类表示是一个Cookie对象,创建好Cookie对象之后通过HttpBaseProtocolFilter对象的CookieManager属性来设置Cookie,然后发送网络请求,这时候的网络请求就会把Cookie信息给带上。设置Cookie的代码示例如下所示:
// 创建一个HttpCookie对象,"id"表示是Cookie的名称,"localhost"是主机名,"/"是表示服务器的虚拟路径 HttpCookie cookie = new HttpCookie("id", "yourwebsite.com", "/"); // 设置Cookie的值 cookie.Value = ""; // 设置Cookie存活的时间,如果设置为null表示只是在一个会话里面生效 cookie.Expires = new DateTimeOffset(DateTime.Now, new TimeSpan(, , )); // 在过滤器里面设置Cookie HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter(); bool replaced = filter.CookieManager.SetCookie(cookie, false);
……接下来可以向"yourwebsite.com"远程主机发起请求
12.2.4 网络请求的进度监控
HttpClient的网络请求是支持进度监控,通过异步任务的IProgress<T>对象可以直接监控到HttpClient的网络请求返回的进度信息,返回的进度对象是HttpProgress类对象。在进度对象HttpProgress里面包含了下面的一些信息:Stage(当前的状态)、BytesSent(已发送的数据大小)、BytesReceived(已接收的数据大小)、Retries(重试的次数)、TotalBytesToSend(总共需要发送的数据大小)和TotalBytesToReceive(总共需要接收的数据大小)。网络请求进度监控的代码示例如下所示:
// 创建IProgress<HttpProgress>对象 IProgress<HttpProgress> progress = new Progress<HttpProgress>(ProgressHandler); // 在异步任务中加入进度监控 HttpResponseMessage response = await httpClient.PostAsync(new Uri(resourceAddress), streamContent).AsTask(cts.Token, progress); // 进度监控的回调方法 private void ProgressHandler(HttpProgress progress) { // 在这里可以通过progress参数获取到进度的相关信息 }
本文来源于《深入浅出Windows Phone 8.1 应用开发》
WP8.1 Runtime文章列表:http://www.cnblogs.com/linzheng/p/3998037.html
源代码下载:http://vdisk.weibo.com/s/zt_pyrfNHb99O
欢迎关注我的微博@WP林政 微信公众号:wp开发(号:wpkaifa)
WP8.1技术交流群:372552293
[深入浅出WP8.1(Runtime)]网络编程之HttpClient类的更多相关文章
- 网络编程之HttpClient类(转)
12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...
- [深入浅出WP8.1(Runtime)]Socket编程之UDP协议
13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...
- Android网络编程之HttpClient运用
Android网络编程之HttpClient运用 在 Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们 ...
- winform网络编程之TcpClient类,TcpListener类和UdpClient类
TcpClient类和TcpListener类 (1)TcpClient的用途: 用于在同步阻止模式下通过网络来链接.发送和接受流数据,在此情况下,必须有侦听此连接的请求,而侦听的任务就交给TcpLi ...
- [深入浅出Cocoa]iOS网络编程之Socket
http://blog.csdn.net/kesalin/article/details/8798039 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] [深入浅出Co ...
- 网络编程之socket
网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...
- python3网络编程之socketserver
本节主要是讲解python3网络编程之socketserver,在上一节中我们讲到了socket.由于socket无法支持多用户和多并发,于是就有了socket server. socket serv ...
- 网络编程之UDP编程
网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...
随机推荐
- C语言中do...while(0)的妙用
在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语句: 通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错 ...
- 【PHP构造方法和析构方法的使用】
构造方法:__construct,析构方法:__destruct 代码示例: <?php class Person { public $name; public $age; public fun ...
- 无废话ExtJs 入门教程二[Hello World]
无废话ExtJs 入门教程二[Hello World] extjs技术交流,欢迎加群(201926085) 我们在学校里学习任何一门语言都是从"Hello World"开始,这里我 ...
- js判断当前的访问是手机还是电脑
<script type="text/javascript"> //平台.设备和操作系统 var system ={ win : false, mac : false, ...
- 基于ZigBee的家居控制系统的设计与应用
基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘 要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...
- linux 用户之间的切换
从root用户切换到普通用户fxm, 使用如下命令:su - fxm 从普通用户切换到root用户,使用如下命令:su - 或者 su, root可以省略不写.
- C语言字符串长度(转)
C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...
- 通过jquery-qrcode在线生成二维码
随着移动互联网的发展,二维码现在应用得越来越广泛了,随手扫扫就可以浏览网站.加个好友什么的,比起手工输入真的是方便太多了. 前期做了一个综合测评系统,考虑逐步实现移动化,一长串的IP地址用户输入也不方 ...
- 通讯录(ios自带无界面)
1,添加框架AddressBook.framework 2,请求权限认证,在Appdelegate.m文件中 - (BOOL)application:(UIApplication *)applicat ...
- Java利用Preferences设置个人偏好
Java利用Preferences设置个人偏好 Preferences的中文意思即偏好或喜好的意思,也就是说同一个程序在每次运行完后,可以通过Preferences来记录用户的偏好,下次启动时,程序会 ...