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. java框架篇---spring AOP 实现原理

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  2. 利用SSIS发送邮件

    璎Nicole珞 博客园 闪存 首页 新随笔 联系 管理 订阅 随笔- 15  文章- 0  评论- 0  SSIS 利用发送邮件服务 Send Email Task   1. 在SSIS中如何发送邮 ...

  3. bat 结束进程

    @echo offEcho 先等待7秒..等待启动其他软件ping 127.0.0.1 -n 60Echo 正在杀死进程...taskkill /f /im funshion.exetaskkill ...

  4. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? #include<iostream> using namespace std; class Parent{ public: int x; ...

  5. sqlserver -- 学习笔记(五)查询一天、一周、一个月记录(DateDiff 函数)(备忘)

    Learn From : http://bjtdeyx.iteye.com/blog/1447300 最常见的sql日期查询的语句 --查询当天日期在一周年的数据 ) --查询当天的所有数据 ) -- ...

  6. [转载]AxureRP 7超强部件库下载

    很多刚刚开始学习Axure的朋友都喜欢到网上搜罗各种部件库(组件库)widgets library ,但是网络中真正实用的并且适合你使用的少之又少,最好的办法就是自己制作适合自己工作内容的部件库. 这 ...

  7. Microsoft Visual Studio 2013 VSTS单元测试指南

    安装vs2013时并未安装VSTS工具包,所以在工具栏:工具->拓展和更新   进行下载安装 vs13已经用了两年了,相比于之前老师推荐的vc6.0感觉要强出很多,刚上手时感觉比较困难,在使用一 ...

  8. Xcode-打开代码折叠带

    preferences --> Text Editing --> 打勾Code folding ribbon

  9. 移动端页面使用单位的问题:关于px、百分比、em、rem开发中逐渐转换的问题记录

    开始写前端页面也有了快两年时间,从一开始的懵逼到现在的淡定,但是不能改变我还是一只小菜鸟的事实,平时遇到的一些问题都会记录在文件夹里,现在都整理一下大家一起分享自己平时也翻翻看看~ 不知道大家平时写的 ...

  10. JS魔法堂:那些困扰你的DOM集合类型

    一.前言 大家先看看下面的js,猜猜结果会怎样吧! 可选答案: ①. 获取id属性值为id的节点元素 ②. 抛namedItem is undefined的异常 var nodes = documen ...