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. WPA字典锦集

    1.xiemimendictionary 字典下载(第二季),500W整理过后还有282W条不重复的密码 字典下载,600W整理过后还有400W条不重复的密码 历次泄+常用弱口令字典集合[无中文去重复 ...

  2. 一款 .NET 下的轻量级 REST 和 HTTP API 客户端 - RestSharp

    项目地址:https://github.com/restsharp/RestSharp Features Supports .NET 3.5+, Silverlight 4, Windows Phon ...

  3. Java后端书架

    本书架主要针对Java后端开发与架构. 更新记录:4.0版把第五部份-具体技术的书整块拿掉了.<TCP/IP详解 卷1:协议>出到了第二版,增加<SRE:Google运维解密> ...

  4. Hadoop入门进阶课程1--Hadoop1.X伪分布式安装

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...

  5. 自定义能够for each的类,C#,Java,C++,C++/cli的实现方法

    自定义类能够被for each,应该算是个老生常谈的话题了,相关的资料都很多,不过这里整理总结主流语言的不同实现方式,并比较部分细节上的差异. 第一种语言,也是实现起来最简单的Java语言.在Java ...

  6. [python]逆水行舟不进则退(1)

    工作后迎来的第一个长假期,打算在家休息一下,看看书之类的.但是不写点东西,不做点东西,感觉有些浪费时间.同时也想通过做点东西检验下自己这段时间的收获.其实在我开始写这篇文章的时候心里还是很没底的-交代 ...

  7. Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)

    1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...

  8. Android、iOS和Windows Phone中的推送技术

    推送并不是什么新技术,这种技术在互联网时代就已经很流行了.只是随着进入移动互联网时代,推送技术显得更加重要.因为在智能手机中,推送从某种程度上,可以取代使用多年的短信,而且与短信相比,还可以向用户展示 ...

  9. OpenProcess打开进程返回错误的问题

    问题描述 项目中需要做一个小功能:能够查看系统中当前正在运行的进程的内存信息,如内存块类型.分配状态.访问权限等.如下图所示: 需要的信息和上图相差无几.说起来也不算太难,毕竟现成的API已经提供了. ...

  10. 通过微软的cors类库,让ASP.NET Web API 支持 CORS

    前言:因为公司项目需要搭建一个Web API 的后端,用来传输一些数据以及文件,之前有听过Web API的相关说明,但是真正实现的时候,感觉还是需要挺多知识的,正好今天有空,整理一下这周关于解决COR ...