【Windows 8 Store App】学习三:HTTP
原文 http://www.cnblogs.com/java-koma/archive/2013/05/22/3093309.html
1,HttpClient
Win 8提供了System.Net.Http.HttpClient类进行常用的http网络请求,HttpClient提供了以下构造函数。
// 摘要:
// 初始化 System.Net.Http.HttpClient 类的新实例。
public HttpClient();
//
// 摘要:
// 用特定的处理程序初始化 System.Net.Http.HttpClient 类的新实例。
//
// 参数:
// handler:
// 用于发送请求的使用的 HTTP 处理程序堆栈。
public HttpClient(HttpMessageHandler handler);
//
// 摘要:
// 用特定的处理程序初始化 System.Net.Http.HttpClient 类的新实例。
//
// 参数:
// handler:
// System.Net.Http.HttpMessageHandler 负责处理 HTTP 响应消息。
//
// disposeHandler:
// 如果内部处理程序应由 Dispose () 处理,则为 true;如果您希望重用内部处理程序,则为 false。
public HttpClient(HttpMessageHandler handler, bool disposeHandler);
第2个构造函数常用来处理在请求前添加header(如:Cookie),响应时解析header。
下面使用HttpClient处理POST/GET提交:
#1. 让我们先来定义好key-value类型的参数,用于提交。
public class Parameter
{
public string key { get; set; }
public string value { get; set; } public Parameter() { }
public Parameter(string key, string value)
{
this.key = key;
this.value = value;
}
}
#2. POST/GET:
private static async Task<string> doRequest<T>(string url, List<Parameter> paramList, bool isPost)
{
System.Net.Http.HttpClient httpClient = null;
try
{
httpClient = new System.Net.Http.HttpClient();
httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
HttpResponseMessage response = null;
// POST
if (isPost)
{
MultipartFormDataContent form = getPostForm(paramList);
response = await httpClient.PostAsync(new Uri(url), form);
}
// GET
else
{
url = generateGetUrl(url, paramList);
response = await httpClient.GetAsync(new Uri(url));
}
return await response.Content.ReadAsStringAsync();
}
catch (Exception) { }
finally
{
if (httpClient != null)
{
httpClient.Dispose();
httpClient = null;
}
}
return null;
}
private static string generateGetUrl(string url, List<Parameter> paramList)
{
if(paramList == null || paramList.Count <= 0)
{
return url;
}
StringBuilder sb = new StringBuilder();
foreach (Parameter item in this.ParamList)
{
if (item == null || string.IsNullOrWhiteSpace(item.key) || string.IsNullOrWhiteSpace(item.value))
{
continue;
}
if (sb.Length > 0)
{
sb.Append("&");
}
sb.Append(string.Format("{0}={1}", item.key, System.Net.WebUtility.UrlEncode(item.value)));
}
return url + (url.IndexOf("?") == -1 ? "?" : "&") + sb.ToString();
} private static MultipartFormDataContent getPostForm(List<Parameter> paramList)
{
MultipartFormDataContent form = new MultipartFormDataContent();
if (paramList != null)
{
foreach (var param in paramList)
{
if (!string.IsNullOrWhiteSpace(param.key))
{
form.Add(new StringContent(param.value, UTF8Encoding.UTF8), param.key);
}
}
}
return form;
}
#3. 处理Cookie,
通常情况下我们需要保持client与server之间的session,server端是通过cookie来识别一个client与另外一个client的。
我们使用上面HttpClient的第2个构造函数,通过MessageProcessingHandler和CookieContainer来每次请求前,把cookie添加到request的header中。
public class CookieHandler : MessageProcessingHandler
{
static CookieHandler()
{
CookieContainer = new CookieContainer();
} public static CookieContainer CookieContainer
{
get;
set;
} public CookieHandler() : base(new CookieHttpClientHandler())
{
} protected override HttpRequestMessage ProcessRequest(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
return request;
} protected override HttpResponseMessage ProcessResponse(HttpResponseMessage response, System.Threading.CancellationToken cancellationToken)
{
Uri httpsUri = new Uri("https://" + response.RequestMessage.RequestUri.Host); var cookieCollection = CookieContainer.GetCookies(httpsUri);
foreach (Cookie cookie in cookieCollection)
{
cookie.Secure = false;
} return response;
}
} class CookieHttpClientHandler : HttpClientHandler
{
public CookieHttpClientHandler()
{
CookieContainer = CookieHandler.CookieContainer;
}
}
使用方式跟前面POST/GET代码唯一不同的是:在构造HttpClient对象时,传入CookieHandler:
var httpClient = new System.Net.Http.HttpClient(new CookieHandler());
2, 文件下载
#1 HttpClient提供了字节流的方式来读取文件,但我测试发现,下载是成功了,但文件经常出现缺少字节的情况。不清楚是怎么回事。
//
// 摘要:
// 将 GET 请求发送到指定 URI 并在异步操作中以字节数组的形式返回响应正文。
//
// 参数:
// requestUri:
// 请求发送到的 URI。
//
// 返回结果:
// 返回 System.Threading.Tasks.Task<TResult>。 表示异步操作的任务对象。
//
// 异常:
// System.ArgumentNullException:
// requestUri 为 null。
public Task<byte[]> GetByteArrayAsync(string requestUri);
//
// 摘要:
// 将 GET 请求发送到指定 URI 并在异步操作中以字节数组的形式返回响应正文。
//
// 参数:
// requestUri:
// 请求发送到的 URI。
//
// 返回结果:
// 返回 System.Threading.Tasks.Task<TResult>。 表示异步操作的任务对象。
//
// 异常:
// System.ArgumentNullException:
// requestUri 为 null。
public Task<byte[]> GetByteArrayAsync(Uri requestUri);
//
// 摘要:
// 将 GET 请求发送到指定 URI 并在异步操作中以流的形式返回响应正文。
//
// 参数:
// requestUri:
// 请求发送到的 URI。
//
// 返回结果:
// 返回 System.Threading.Tasks.Task<TResult>。 表示异步操作的任务对象。
//
// 异常:
// System.ArgumentNullException:
// requestUri 为 null。
public Task<System.IO.Stream> GetStreamAsync(string requestUri);
//
// 摘要:
// 将 GET 请求发送到指定 URI 并在异步操作中以流的形式返回响应正文。
//
// 参数:
// requestUri:
// 请求发送到的 URI。
//
// 返回结果:
// 返回 System.Threading.Tasks.Task<TResult>。 表示异步操作的任务对象。
//
// 异常:
// System.ArgumentNullException:
// requestUri 为 null。
public Task<System.IO.Stream> GetStreamAsync(Uri requestUri);
#2. BackgroundDownloader
Win 8提供了BackgroundDownloader可以用于在后台下载文件,它也可以调用setRequestHeader向请求中添加header信息 (与上面的CookieHandler结合使用,可以处理那些需要登陆才能下载文件的情况),下面演示了普通的文件下载:
public async static Task<IAsyncOperation<StorageFile>> DownloadAsync(string url)
{
string fileName = url.Substring(url.LastIndexOf("/") + 1).Trim();
var option = Windows.Storage.CreationCollisionOption.ReplaceExisting;
StorageFile destinationFile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, option);
BackgroundDownloader downloader = new BackgroundDownloader();
DownloadOperation download = downloader.CreateDownload(new Uri(url), destinationFile);
await download.StartAsync().AsTask();
ResponseInformation response = download.GetResponseInformation();
if(response.StatusCode == 200)
{
DownloadHelper.addDownloadFileSuccess(fileName);
return DownloadHelper.getDownloadFileAsync(fileName);
}
return null;
}
【Windows 8 Store App】学习三:HTTP的更多相关文章
- 【Windows 8 Store App】学习二:ResourceLoader
原文 http://www.cnblogs.com/java-koma/archive/2013/05/22/3093308.html 在项目开发时,通常有一些资源信息需要存储起来,比如请求的URL, ...
- 【Windows 8 Store App】学习:目录
原文http://www.cnblogs.com/java-koma/archive/2013/05/22/3093302.html 写在前面:我之前从事java开发,对MS的一整套东西还没入门哈,难 ...
- 【Windows 8 Store App】学习一:获取设备信息
原文http://www.cnblogs.com/java-koma/archive/2013/05/22/3093306.html 通常情况下我们需要知道用户设备的一些信息:deviceId, os ...
- 01、Windows Store APP 设置页面横竖屏的方法
在 windows phone store app 中,判断和设置页面横竖屏的方法,与 silverlight 中的 Page 类 不同,不能直接通过 Page.Orientation 进行设置.而是 ...
- Windows 8.1 store app 开发笔记
原文:Windows 8.1 store app 开发笔记 零.简介 一切都要从博彦之星比赛说起.今年比赛的主题是使用Bing API(主要提到的有Bing Map API.Bing Translat ...
- Windows store app[Part 3]:认识WinRT的异步机制
WinRT异步机制的诞生背景 当编写一个触控应用程序时,执行一个耗时函数,并通知UI更新,我们希望所有的交互过程都可以做出快速的反应.流畅的操作感变的十分重要. 在连接外部程序接口获取数据,操作本地数 ...
- 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)
这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...
- Windows Store App 过渡动画
Windows Store App 过渡动画 在开发Windows应用商店应用程序时,如果希望界面元素进入或者离开屏幕时显得自然和流畅,可以为其添加过渡动画.过渡动画能够及时地提示用户屏幕所发 ...
- 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期
[源码下载] 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的 ...
随机推荐
- BroadcastReceiver浅析
1.什么是BroadcastReceiver? 本质上是属于一个监听器,但onXxxListenter只是程序级别的监听器,当程序退出时候监听器也随之关闭.而BroadcastReceiver是系统级 ...
- php正则提取img所有属性值
$ext = 'gif|jpg|jpeg|bmp|png';//罗列图片后缀从而实现多扩展名匹配 by http://www.k686.com 绿色软件 $str = ''; $list = arra ...
- [ReactiveCocoa]最简单的RAC入门操作
当knowckout.js出来的时候,确实被其kobinding惊艳了一下,等到AngularJS出来的时候,把MVVM的模式更是向前推进了一步.所以当ReactiveCocoa出来的时候,也很感兴趣 ...
- Linux的用户和用户组管理
Linux是个多用户多任务的分时操作系统,所有一个要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面能帮助系统管理员对使用系统的用户进行跟踪,并控 ...
- Jdt Javax
http://www.javablogging.com/dynamic-in-memory-compilation/ http://www.java2s.com/Code/Java/JDK-6/Com ...
- node.js NPM 使用
n=NPM是一个Node包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准.有了NPM,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包.npms安装: 下载npm源 ...
- aix installp软件包管理工具
软件可以安装成两种状态:applied和committed.Applied状态保存了原来以前版本的软件,它把以前版本存储在/usr/lpp/PackageName目录下.这种方式可以回滚到以前的软件版 ...
- 一张图告诉你如何优化web 性能
- HipHop算法:利用微博互动关系挖掘社交圈
/* 版权声明:可以任意转载,转载时请务必标明文章原始出处和作者信息 .*/ CopyMiddle: 张俊林 TimeStamp:2012年3 月 在微博环境下,如何 ...
- usb键鼠标驱动分析
一.鼠标 linux下的usb鼠标驱动在/drivers/hid/usbhid/usbmouse.c中实现 1.加载初始化过程 1.1模块入口 module_init(usb_mouse_init); ...