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详解的更多相关文章

  1. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  2. C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  3. Extjs MVC开发模式详解

    Extjs MVC开发模式详解   在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...

  4. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  5. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  6. 免费的HTML5连载来了《HTML5网页开发实例详解》连载(二)

    最近新浪.百度.腾讯.京东.大众点评.淘宝等流行的网站都加大了招聘HTML5的力度,HTML5开发人员成了抢手货,本次连载的是由大众点评前端工程师和一淘网前端工程师基情奉献的<HTML5网页开发 ...

  7. 免费的HTML5连载来了《HTML5网页开发实例详解》连载(六)媒体查询

    响应式设计的另一个重要技术手段是媒体查询.如果只是简单的设计一个流式布局系统,那么可以保证每个网格按比例的放大和缩小,但有可能会使得在小屏幕下(如手机设备)网格太小而严重影响阅读,这样的设计称不上响应 ...

  8. 免费的HTML5连载来了《HTML5网页开发实例详解》连载(五)图解通过Fiddler加速开发

    Fiddler是Windows底下最强大的请求代理调试工具,监控任何浏览器的HTTP/HTTPS流量,窜改客户端请求和服务器响应,解密HTTPS Web会话,图4.44为Fiddler原理示意图. 图 ...

  9. 《HTML5网页开发实例详解》连载(四)HTML5中的FileSystem接口

    HTML 5除了提供用于获取文件信息的File对象外,还添加了FileSystem相关的应用接口.FileSystem对于不同的处理功能做了细致的分类,如用于文件读取和处理的FileReader和Fi ...

随机推荐

  1. Android代码优化工具——Android lint

    作为移动应用开发者,我们总希望发布的apk文件越小越好,不希望资源文件没有用到的图片资源也被打包进apk,不希望应用中使用了高于minSdk的api,也不希望AndroidManifest文件存在异常 ...

  2. 哇塞,原来自己写 Google Chrome 浏览器扩展(插件)这么容易!

    1. 首先新建一个记事本,命名为 manifest.json,这是写 Google Chrome 浏览器扩展必须的文件 { "manifest_version": 2, " ...

  3. Linux高级编程--04.GDB调试程序(查看数据)

    查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入"栈"(Stack)中.你可以用 ...

  4. 伸展树(二)之 C++的实现

    概要 上一章介绍了伸展树的基本概念,并通过C语言实现了伸展树.本章是伸展树的C++实现,后续再给出Java版本.还是那句老话,它们的原理都一样,择其一了解即可. 目录1. 伸展树的介绍2. 伸展树的C ...

  5. vuejs入门小demo-搜索大全

    这个demo非常适合入门的同学,不再是简单的todolist.用到的知识点有组件通信,过渡效果,vue-rsource,还有一些基本的vue指令. 先放一张截图: 是不是感觉高端大气上档次呢,演示地址 ...

  6. IT人的自我导向型学习:学习的3个维度

    看到大家对我的文章赞了不少,看来大家还比较喜欢看.园子里的一些朋友和我说:”终于又看到你要在园子里发原创文章了.几年前就受益匪浅,经过几年的成长分享来的东西肯定也是精品.“ 感谢大家对我的信任,如果你 ...

  7. 最近读cocoaui源代码有感

    上半年为了做一个ios的应用,引入了cocoaui库,主要是用来布局ios界面,发现简化了不少代码和工作量.因为在写第一个ios应用的时候,用的代码布局,在适配4s和6的机型时候,几乎被搞死,大量的约 ...

  8. HashMap的实现原理

    1.HashMap的数据结构 数组的特点是:寻址容易,插入和删除困难:而链表的特点是:寻址困难,插入和删除容易.那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的, ...

  9. 【Beta阶段】团队源代码管理

    0. 快速上手与理解 如果你的团队来了一个新队员,有一台全新的机器,你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新.最稳定版本的软件编译出来,并运行必要的 ...

  10. Week1项目报告

    1. 预测时间 Personal Software Process Stages Time(h) 计划 · 估计这个任务需要多少时间 16.5 开发 · 需求分析 (包括学习新技术) 4 · 生成设计 ...