UWP开发-HTTP详解
HTTP作为一个基础功能,有必要介绍下在UWP下的使用方法。
一、Get请求:
一般我们用到的是GetAsync方法
public static async Task Gets(Uri uri)
{
var response = await httpClient.GetAsync(uri);
var str = await response.Content.ReadAsStringAsync();
var stream = await response.Content.ReadAsInputStreamAsync();
var buff = await response.Content.ReadAsBufferAsync(); str = await httpClient.GetStringAsync(uri);
stream = await httpClient.GetInputStreamAsync(uri);
buff = await httpClient.GetBufferAsync(uri);
}
上面方法中的前四行和后三行是等价的。
如果要读取更多的信息,则用GetAsync读取返回值的response。
二、Post请求:
一般来说,我们最常用的是发送一个json串返回也是json串,也就是application/json类型
async public static Task<string> PostStringAsync(string url, string data)
{
try
{
HttpClient hc = new HttpClient();
using (var content = new HttpStringContent(data))
{
var response = await hc.PostAsync(new Uri(url), content);
var resdata = await response.Content.ReadAsStringAsync();
return resdata;
}
}
catch
{
return null;
}
}
如果服务器要求的类型是表单类型,也就是x-www-form-urlencoded类型
public async static Task<string> PostFormDataAsync(string url, List<KeyValuePair<string, string>> data)
{
try
{
HttpClient hc = new HttpClient();
var content = new HttpFormUrlEncodedContent(data);
var response = await hc.PostAsync(new Uri(url), content);
var resdata = await response.Content.ReadAsStringAsync();
Debug.WriteLine(resdata);
return resdata;
}
catch
{
return null;
}
}
KeyValuePair的构造(注意这里只有string类型和数值类型,不能包含文件类型):
public List<KeyValuePair<string, string>> CreatFormData<T>(T data)
{
List<KeyValuePair<string, string>> array = new List<KeyValuePair<string, string>>();
var type = data.GetType();
var propertyInfos = type.GetRuntimeProperties();
foreach (var p in propertyInfos)
{
if (p.GetValue(data) != null)
{
array.Add(new KeyValuePair<string, string>(p.Name, p.GetValue(data).ToString()));
}
}
return array;
}
如果要传的数据包含文件肿么办?
第一种情况:只有文件 ,application/octet-stream
这种情况比较简单,构造一个HttpStreamContent就可以了:
async public static Task<string> PostSteamAsync(string url, StorageFile file)
{
try
{
HttpClient hc = new HttpClient();
using (var content = new HttpStreamContent(await file.OpenAsync(FileAccessMode.Read)))
{
var response = await hc.PostAsync(new Uri(url), content);
var resdata = await response.Content.ReadAsStringAsync();
return resdata;
}
}
catch
{
return null;
} }
第二种情况:既有文件也有数据和字符串。也就是multipart/form-data类型
/// <summary>
/// 构造表单数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
async private static Task<HttpMultipartFormDataContent> ConstructMuilFromDataAsync(List<FormData> data)
{
var resdata = new HttpMultipartFormDataContent(boundary);
foreach (var item in data)
{
if (item.File == null && !string.IsNullOrEmpty(item.Value))
{
var scontent = new HttpStringContent(item.Value);
scontent.Headers.ContentDisposition = new HttpContentDispositionHeaderValue("form-data");
resdata.Add(scontent, item.Name);
}
else if (item.File != null)
{
var stream = await item.File.OpenAsync(FileAccessMode.Read); var buffcontent = new HttpStreamContent(stream);
buffcontent.Headers.ContentDisposition = new HttpContentDispositionHeaderValue("form-data");
buffcontent.Headers.ContentType = HttpMediaTypeHeaderValue.Parse(item.ContentType);
resdata.Add(buffcontent, item.Name, item.FileName);
}
}
return resdata;
} /// <summary>
/// 发送复杂表单类型
/// </summary>
/// <param name="url"></param>
/// <param name="data"></param>
/// <returns></returns>
async public static Task<string> PostMuilFormDataAsync(string url, List<FormData> data)
{
try
{
HttpClient hc = new HttpClient();
var content = await ConstructMuilFromDataAsync(data);
var response = await hc.PostAsync(new Uri(url), content);
var resdata = await response.Content.ReadAsStringAsync();
Debug.WriteLine(resdata);
return resdata;
}
catch
{
return null;
}
}
///自定义FormData类
public class FormData
{
private string _name;
private string _value;
private string _type;
public string Name
{
get { return _name; }
set { _name = value; }
}
public string Value
{
get { return _value; }
set { _value = value; }
}
public string ContentType
{
get { return _type; }
set { _type = value; }
}
public StorageFile File { get; set; }
public string FileName { get; set; } }
关于这段的FormData是我自己构造的,如果你有更好的方法,请告诉我。其中ContenType:Image为”Image/jpeg“;MP3为”Audio/MP3“;MP4为”Video/MP4“关于其他的则可以自行在网络上查询。
好了,关于Http的介绍就到这里了,如果还有其他的问题,欢迎留言或者联系我
UWP开发-HTTP详解的更多相关文章
- 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING
<Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th 2014 Email:skyseraph00@163.com 更多精彩请直接 ...
- C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- Extjs MVC开发模式详解
Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(二)
最近新浪.百度.腾讯.京东.大众点评.淘宝等流行的网站都加大了招聘HTML5的力度,HTML5开发人员成了抢手货,本次连载的是由大众点评前端工程师和一淘网前端工程师基情奉献的<HTML5网页开发 ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(六)媒体查询
响应式设计的另一个重要技术手段是媒体查询.如果只是简单的设计一个流式布局系统,那么可以保证每个网格按比例的放大和缩小,但有可能会使得在小屏幕下(如手机设备)网格太小而严重影响阅读,这样的设计称不上响应 ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(五)图解通过Fiddler加速开发
Fiddler是Windows底下最强大的请求代理调试工具,监控任何浏览器的HTTP/HTTPS流量,窜改客户端请求和服务器响应,解密HTTPS Web会话,图4.44为Fiddler原理示意图. 图 ...
- 《HTML5网页开发实例详解》连载(四)HTML5中的FileSystem接口
HTML 5除了提供用于获取文件信息的File对象外,还添加了FileSystem相关的应用接口.FileSystem对于不同的处理功能做了细致的分类,如用于文件读取和处理的FileReader和Fi ...
随机推荐
- 在redhat上搭建redmine
搞个项目管理的东西 找了下还是redmine比较合适,行动action: 1.ruby 额 是的你没有看错 需要先安装一个ruby的环境.话说这个安装起来很是纠结,本来想用yum 结果咩有成功,于是乎 ...
- ruby -- 进阶学习(十三)解说ckeditor在production环境下如何完整显示
将ROR项目从development环境改为production环境时,运行rake assets:precompile后, ckeditor的界面就无法完整显示?! @_@?? 出现 ActionC ...
- 0x00411202指令引用的0x00000000内存该内存不能为read错误,怎么解决
0X000000该内存不能为read的解决方法 出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了. 一.先说说硬件问题,主要方面是: 1.内存条坏了 更换内存条 2.双 ...
- Pace.js – 超赞的页面加载进度自动指示和 Ajax 导航效果
在页面中引入 Pace.js 和您所选择主题的 CSS 文件,就可以让你的页面拥有漂亮的加载进度和 Ajax 导航效果.不需要挂接到任何代码,自动检测进展.您可以选择颜色和多种效果,有简约,闪光灯, ...
- 2013/11/21工作随笔-PHP开启多进程
今天被问到一个问题,php如何开启多进程才比较稳定. php开启多进程执行一个操作有哪些方法: 首先想到的是使用pcntl的fork 具体可以参考之前的文章:PHP的pcntl多进程 其次想到的方法是 ...
- HT图形组件设计之道(二)
上一篇我们自定义CPU和内存的展示界面效果,这篇我们将继续采用HT完成一个新任务:实现一个能进行展开和合并切换动作的刀闸控件.对于电力SCADA和工业控制等领域的人机交互界面常需要预定义一堆的行业标准 ...
- Websocket 概述
WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). [[ from websocket是什么原理? ]] 一.WebSocke ...
- for循环的嵌套,for循环的穷举迭代
for循环的嵌套 输入一个正整数,求阶乘的和 嵌套 Console.Write("请输入一个正整数:"); int ...
- vs 2010 中类文文件模板的修改
类模板 文件的修改,以前也修改过,这次有个同事问我,搞了有一会才搞定,这里还是记录分享下. 如果想在每次创建文件时,自动生成文档注释(注意是自动生成文档注释而不是帮助文档),如下面的代码,需要设置VS ...
- 关于URL、Web的一些概念
关于URL ★ 书写路径时,网络文件用斜杠“/”划分不同层级,本地文件管理系统用反斜杠“\”,分隔不同层级: 如下图示 ★ 绝对/相对 ...