Windows Store App 网络通信 HttpClient
HttpClient类包含在System.Net.Http命名空间中,是向以URI标识的网络资源发送HTTP请求和接收HTTP响应的基类。在HTTP请求中使用该类可以向Web服务发送GET、POST等异步请求,并接收服务器返回的响应数据。
下面以一个应用程序为例,介绍如何使用HttpClient类向Web服务发送GET请求并接收响应数据。该应用使用HttpClient类从网络获得XML格式的数据并在应用界面上显示。
在Visual Studio 2012中新建一个Windows应用商店的空白应用程序项目,并命名为HttpClientBasic。由于应用需要使用网络,那么应该首先为应用开启访问网络的权限,双击打开项目的package.appxmanifest文件,选择其中的功能选项卡。可以看到默认勾选了选项卡中的“Internet(客户端)”选项;若没有,请勾选项卡中的“Internet(客户端)”选项,然后保存修改。设置结果如图14-1所示。
图14-1 启用网络访问功能
从上面的介绍可以知道,本示例不只是获得网络数据,还要把获得的数据显示出来,为了实现这些功能,向应用界面添加一个按钮和三个文本框,代码如下所示:
<Canvas>
<TextBlock Text="URI地址" FontSize="18" Height="20" Canvas.Left="18" Canvas.Top="10" RenderTransformOrigin="0.4,0.5" />
<!--添加输入地址的文本框-->
<TextBox x:Name="InputAddrdess" Text="http://api.douban.com/book/subject/1220562?apikey=0112912082b26b5d0337b36188174217" FontSize="18" Height="20" Width="500" Canvas.Left="104" Canvas.Top="6"/>
<!--添加获取按钮-->
<Button Content="获取" Click="Start_Click" Canvas.Left="609" FontSize="18"/>
<TextBlock Text="状态" FontSize="18" Height="20" Canvas.Left="18" Canvas.Top="43" RenderTransformOrigin="0.857,-1.25" />
<!--添加显示请求状态的文本框-->
<TextBox x:Name="StatusText" Text="空闲" FontSize="18" Height="Auto" TextWrapping="Wrap" Canvas.Left="104" Canvas.Top="43" Width="500" />
<TextBlock FontSize="18" Text="返回的XML数据" Canvas.Left="18" Canvas.Top="89"></TextBlock>
<!--添加显示响应数据的文本框-->
<TextBox x:Name="OutputView" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" AcceptsReturn="True" FontSize="16" Height="170" Grid.RowSpan="2" Width="500" Canvas.Left="104" Canvas.Top="116" />
</Canvas>
在上面的代码中,“获取”按钮用来发送HTTP请求,三个文本框中一个用于输入URI地址,一个显示HTTP响应的内容,另外一个显示HTTP请求的状态和错误信息。
布局好前台界面后,下面来介绍后台功能的实现,首先在MainPage.xaml.cs文件中定义一个HttpClient类型的对象httpClient,并在构造方法中初始化httpClient对象,以便在后续代码中使用,具体实现代码如下所示:
//定义全局变量
private HttpClient httpClient;
public MainPage()
{
this.InitializeComponent();
httpClient = new HttpClient();
//增加可接收响应的最大缓冲大小,防止在接收Web服务返回的响应时发生异常
httpClient.MaxResponseContentBufferSize = 512 * 1024;
//添加用户代理标头
httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
}
上面的代码设置了httpClient对象的MaxResponseContentBufferSize和DefaultRequestHeaders属性。MaxResponseContentBufferSize表示可接收响应的最大缓冲大小,默认值为64KB,为避免因为缓冲区太小造成不能正确接收HTTP响应,这里把MaxResponseContentBufferSize属性设置为512 * 1024表示512KB。
在默认情况下,HttpClient对象不会将用户代理标头随HTTP请求一起发送,但一些Web服务器要求从客户端发送的HTTP请求附带用户代理标头,如果没有标头,则返回错误。所以为了避免这样的情况发生,本应用使用httpClient对象的DefaultRequestHeaders属性为HTTP请求添加了客户端代理标头。
对httpClient对象进行了一些基本设置之后,下面将使用httpClient对象发送GET请求和接收服务器响应并将结果显示在前台界面上。本示例通过给“获取”按钮添加单击事件来实现这些功能,“获取”按钮事件处理方法的代码如下所示:
private async void Start_Click(object sender, RoutedEventArgs e)
{
if (String.IsNullOrEmpty(InputAddrdess.Text))
{
//如果URI为空,输出提示信息
StatusText.Text = "输入的URI为空";
}
else
{
try
{
string responseBodyAsText;
OutputView.Text = "";
StatusText.Text = "等待响应...";
//发送请求
HttpResponseMessage response = await httpClient.GetAsync(InputAddrdess.Text);
//确认请求是否成功
response.EnsureSuccessStatusCode();
//更新请求状态
StatusText.Text = response.StatusCode + " " + response.ReasonPhrase;
//把XML响应转换成字符串形式
responseBodyAsText = await response.Content.ReadAsStringAsync();
//用换行替换响应中的<br>
responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine);
//显示响应
OutputView.Text = responseBodyAsText;
}
catch (HttpRequestException hre)
{
//显示异常信息
StatusText.Text = "错误" + hre.ToString();
}
catch (Exception ex)
{
//显示异常信息
StatusText.Text = ex.ToString();
}
}
}
在上面的代码中,首先会检查输入的URI地址是否为空。如果为空会在StatusText文本框里面显示“输入的URI为空”;如果不为空则调用httpClient对象的异步方法GetAsync请求已输入的URI资源,GetAsync方法会返回HttpResponseMessage类型的对象response。
使用response对象的EnsureSuccessStatusCode方法用于确认请求是否成功,如果成功则更新StatusText中的请求状态。接下来使用response 对象的Content.ReadAsStringAsync异步方法将响应内容写入到responseBodyAsText变量中,最后把responseBodyAsText变量中的内容显示在OutputView文本框中。上面的代码使用了try-catch块捕获可能发生的异常,若在catch块中捕捉到了异常,将在StatusText文本框中输出异常信息。
运行程序,会发现URI地址文本框已经有默认内容了,如果想要使用其他URI地址可以自行输入。单击“获取”按钮,会向输入的URI地址发送GET请求并得到响应结果,界面显示效果如图14-2所示。
图14-2界面显示
Windows Store App 网络通信 HttpClient的更多相关文章
- Windows Store App 网络通信 HttpWebRequest
如果希望更好地控制HTTP请求,可以使用System.Net类库中的HttpWebRequest类,该类对HTTP协议进行了完整的封装,并且提供了很多对HTTP协议中的 Header.Content和 ...
- 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)
这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...
- Windows Store App 过渡动画
Windows Store App 过渡动画 在开发Windows应用商店应用程序时,如果希望界面元素进入或者离开屏幕时显得自然和流畅,可以为其添加过渡动画.过渡动画能够及时地提示用户屏幕所发 ...
- Windows store app[Part 4]:深入WinRT的异步机制
接上篇Windows store app[Part 3]:认识WinRT的异步机制 WinRT异步机制回顾: IAsyncInfo接口:WinRT下异步功能的核心,该接口提供所有异步操作的基本功能,如 ...
- Windows store app[Part 3]:认识WinRT的异步机制
WinRT异步机制的诞生背景 当编写一个触控应用程序时,执行一个耗时函数,并通知UI更新,我们希望所有的交互过程都可以做出快速的反应.流畅的操作感变的十分重要. 在连接外部程序接口获取数据,操作本地数 ...
- 05、Windows Store app 的图片裁切(更新)
在 Win Phone Silverlight api 中,有一个 PhotoChooserTask 选择器,指定宽.高属性,在选择图片的时候, 可以进行裁切,代码: PhotoChooserTask ...
- 01、Windows Store APP 设置页面横竖屏的方法
在 windows phone store app 中,判断和设置页面横竖屏的方法,与 silverlight 中的 Page 类 不同,不能直接通过 Page.Orientation 进行设置.而是 ...
- Windows store app[Part 1]:读取U盘数据
Windows 8系统下开发App程序,对于.NET程序员来说,需要重新熟悉下类库. 关于WinRT,引用一张网上传的很多的结构图: 图1 针对App的开发,App工作在系统划定的安全沙箱内,所以通过 ...
- Windows store app Settings 的 应用 ( viewmodel + windows.storage)
1.在首页 加入 一个元素(加下滑线的).此元素绑定了两个属性 <!DOCTYPE html> <html> <head> <meta charset=&qu ...
随机推荐
- 我理解的webservice是这样的
本文来自 --迹忆:http://www.onmpw.com/tm/xwzj/network_45.html 最近在工作中遇到这样的一个项目(暂且定为项目A),项目A本身是用PHP开发的,但是其数据是 ...
- Bootstrap学习(2)--表单
Bootstrap里的role属性,增强标签的语义化,提高识别力, 如:<form role="form"> input.select.textarea等元素,在Bo ...
- pysvn安装及常用方法
centos 6.5,svn 1.6.11,pysvn 1.7.6,文章内容来自官网文档:http://pysvn.tigris.org/docs/pysvn_prog_guide.html 直接用y ...
- 高通平台FastMMI(FFBM模式)简介与进入方法
参考: http://blog.csdn.net/tfslovexizi/article/details/51499979 http://www.voidcn.com/blog/jimbo_lee/a ...
- build/envsetup.sh 生成的命令详解表
参考: https://wiki.cyanogenmod.org/w/Envsetup_help 它是一个.sh文件,用source后就生成android编译相关函数,具体如下. 速查 Invokin ...
- ORACLE常用SQL优化hint语句
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...
- Hibernate ManyToOne, OneToMany的理解
User to Group, Many to One的关系 Test Case 1: session.beginTransaction(); user.setGroup(group); session ...
- 第三天的学习知识HTML5常用的重要单词
a: a:猫 address:地址 alt:替用(一般是图片显示不出的提示) b: b:粗体 br:换行 background:背景 border:边框 ...
- kali/centos 更新 java
kali 转自:http://blog.sina.com.cn/s/blog_5736d8870102w15u.html 墙内的论坛上和博客上有很多这样的文章了,不过一般过程都很复杂,让人看的头晕眼花 ...
- Ruff is in the house
Ruff is in my home. 浦东的一家小厂出产的开发板,让我可以用万能的JS开发. 等下试试它的树莓派SDK. 新的时代,旧的东西在被慢慢改进.只要有一颗想动手捣鼓的心,自然会找到合适的工 ...