Windows phone开发 网络编程之HttpWebRequest
HttpWebRequest和WebClient的区别
1,HttpWebRequest是个抽象类,所以无法new的,需要调用HttpWebRequest.Create();
2,其Method指定了请求类型,这里用的GET,还有POST;也可以指定ConentType;
3,其请求的Uri必须是绝对地址;
4,其请求是异步回调方式的,从BeginGetResponse开始,并通过AsyncCallback指定回调方法;
5,WebClient方式使用基于事件的异步编程模型,在HTTP响应返回时引发的WebClient回调是在UI线程中调用的,因此可用于更新UI元素的性。HttpWebRequest是基于后台进程运行的,回调不是UI线程,所以不能直接对UI进行操作,通常使用Dispatcher.BeginInvoke()跟界面进行通讯。
HTTP中GET请求与POST请求的区别:
1.GET请求是从服务器上获取数据 POST请求是向服务器传送数据
2.GET请求在通过URL提交数据,数据在URL中可以看到 POST请求数据是通过写入数据流的方式提交
3.GET请求提交的数据最多只能1024个字节 POST请求提交的数据没有限制
HttpWebRequest类实现GET请求
1.通过HttpWebRequest.CreateHttp()方法可以创建一个HttpWebRequest对象;
2.设置请求的参数(如设置请求方式为GET);
3.发起异步响应请求:BeginGetGetResponse;
4.结束异步响应EndGetResponse;
5.获取请求的内容;
6.对请求进行异常处理。
通过下面的例子增加对HttpWebRequest类的GET请求方式的理解:
public void httpWebRequestGet()
{
try{
String uri = "http://www.baidu.com/ ";
WebRequest request = HttpWebRequest.CreateHttp(new Uri(uri)); //创建WebRequest对象
request.Method = "GET"; //设置请求方式为GET
request.BeginGetResponse(responseStreamCallback, request); //发起GetResponse请求,返回应答请求异步操作的状态
}
catch(WebException e)
{
outputBlock.Text += "\n出现异常请求失败!\n";
outputBlock.Text += "异常信息: ";
outputBlock.Text += e.Message;
outputBlock.Text += "\nStatus: ";
outputBlock.Text += e.Status;
}
catch(Exception e)
{
outputBlock.Text += "\n出现异常请求失败!\n";
outputBlock.Text += "\n异常信息: ";
outputBlock.Text += e.Message;
}
} private void responseCallback(IAsyncResult result)
{
try{
HttpWebRequest request = (HttpWebRequest)result.AsyncState; //获取异步操作返回的的信息
WebResponse response = request.EndGetResponse(result);
using (Stream stream = response.GetResponseStream()) //获取请求返回内容
using(StreamReader read = new StreamReader(stream))
{
string text = read.ReadToEnd();
Dispatcher.BeginInvoke(() => //使用Dispatcher.BeginInvoke()更新UI信息
{
textBlock1.Text = text;
});
} }
//异常处理
catch(WebException e)
{
outputBlock.Text += "\n出现异常请求失败!\n";
outputBlock.Text += "异常信息: ";
outputBlock.Text += e.Message;
outputBlock.Text += "\nStatus: ";
outputBlock.Text += e.Status;
}
catch(Exception e)
{
outputBlock.Text += "\n出现异常请求失败!\n";
outputBlock.Text += "\n异常信息: ";
outputBlock.Text += e.Message;
}
}
HttpWebRequest类实现POST请求
1.通过HttpWebRequest.CreateHttp()方法可以创建一个HttpWebRequest对象;
2.设置请求的参数(如设置请求方式为POST)
3.发起获取要发送的数据流请求:BeginGetRequestStreamGetResponseStream请求;
4.结束异步的数据流请求:EndGetRequestStream;
5.把要传递的数据写入数据流;
6.发起异步响应请求:BeginGetGetResponse;
7.结束异步响应EndGetResponse ;
8.获取请求的内容;
9.对请求进行异常处理
通过下面的例子增加对HttpWebRequest类的POST请求方式的理解:
public void httpWebRequestPost()
{
try{
String uri = "http://www.baidu.com/ ";
WebRequest request = HttpWebRequest.CreateHttp(new Uri(uri)); //创建WebRequest对象
request.Method = "POST"; //设置请求方式为POST
request.BeginGetRequestStream(responseStreamCallback, request); //发起GetResponseStream请求,返回应答请求异步操作的状态
}
catch(WebException e)
{
outputBlock.Text += "\n出现异常请求失败!\n";
outputBlock.Text += "异常信息: ";
outputBlock.Text += e.Message;
outputBlock.Text += "\nStatus: ";
outputBlock.Text += e.Status;
}
catch(Exception e)
{
outputBlock.Text += "\n出现异常请求失败!\n";
outputBlock.Text += "\n异常信息: ";
outputBlock.Text += e.Message;
}
}
//发起获取发送数据流的请求的响应 peivate void responseStreamCallback(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState; //获取异步操作返回的的信息
Stream stream = httpWebRequest.EndGetRequestStream(result)) String str = "hello world!";
byte[] data = Encoding.UTF8.GetBytes(str);
stream.Write(data,,data.Length);
stream.Close(); request.BeginGetResponse(responseCallback, request);
} private void responseCallback(IAsyncResult result)
{
try{
HttpWebRequest request = (HttpWebRequest)result.AsyncState; //获取异步操作返回的的信息
WebResponse response = (WebResponse)request.EndGetResponse(result);
using (Stream stream = response.GetResponseStream())
using ( StreamReader read = new StreamReader(stream)
{
string text = read.ReadToEnd();
Dispatcher.BeginInvoke(() => //使用Dispatcher.BeginInvoke()更新UI信息
{
textBlock.Text = text;
});
} }
//异常处理
catch(WebException e)
{
outputBlock.Text += "\n出现异常请求失败!\n";
outputBlock.Text += "异常信息: ";
outputBlock.Text += e.Message;
outputBlock.Text += "\nStatus: ";
outputBlock.Text += e.Status;
}
catch(Exception e)
{
outputBlock.Text += "\n出现异常请求失败!\n";
outputBlock.Text += "\n异常信息: ";
outputBlock.Text += e.Message;
}
}
文章为作者原创,转载请标明出处,谢谢 http://www.cnblogs.com/spilledlight/p/4929418.html
Windows phone开发 网络编程之HttpWebRequest的更多相关文章
- [深入浅出WP8.1(Runtime)]网络编程之HttpClient类
12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...
- 网络编程之HttpClient类(转)
12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...
- 网络编程之TCP/IP各层详解
网络编程之TCP/IP各层详解 我们将应用层,表示层,会话层并作应用层,从TCP/IP五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议,就理解了整个物联网通信的原理. 首先,用户感知到的只 ...
- 网络编程之Socket & ServerSocket
网络编程之Socket & ServerSocket Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP ...
- GO语言的进阶之路-网络编程之socket
GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...
- [深入浅出Cocoa]iOS网络编程之Socket
http://blog.csdn.net/kesalin/article/details/8798039 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] [深入浅出Co ...
- Android网络编程之HttpClient运用
Android网络编程之HttpClient运用 在 Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们 ...
- 网络编程之Socket代码实例
网络编程之Socket代码实例 一.基本Socket例子 Server端: # Echo server program import socket HOST = '' # Symbolic name ...
- 网络编程之C10K
网络编程之C10K 虽然在过去的十几年里C10K问题已经可以很好的解决,但学习网络编程时研究C10K问题仍然价值巨大,因为技术的发展都是有规律和线索可循的,了解C10K问题及其解决思路,通过举一反三, ...
随机推荐
- oracle的递归运算(树运算) 无限树形
oracle的递归运算(树运算)start with org_id ='1'connect by prior parent_id=son_id 1.前言 oracle的递归运算,在我们web页面的 ...
- uva 202(Repeating Decimals UVA - 202)
题目大意 计算循环小数的位数,并且按照格式输出 怎么做 一句话攻略算法核心在于a=a%b*10,用第一个数组记录被除数然后用第二个数组来记录a/b的位数.然后用第三个数组记录每一个被除数出现的位置好去 ...
- C#学习笔记_12_枚举&结构体
12_枚举&结构体 枚举 是一种数据类型 适用于某些取值范围有限的数据 语法: [访问权限修饰符] enum 枚举名 { 枚举值 } 枚举名遵循大驼峰命名法 枚举一般情况下是和switch c ...
- (蓝桥)2017C/C++A组第一题迷宫
#include<iostream> #include<memory.h> using namespace std; char mi[10][10] ; int visited ...
- F2BPM中关于工作流引擎驳回设计
1.1 关于驳回 驳回,在有的应用中叫“回退”.驳回是中国特色的一种方式,驳回在流程图上也没有迁移线的表达经常也是隐性的,比如申请经费可能由于资料不足被驳回来补充资料,像这样的例子有非常多,也很常见. ...
- CF #323 DIV2 D题
可以知道,当T较大时,对于LIS,肯定会有很长的一部分是重复的,而这重复的部分,只能是一个block中出现次数最多的数字组成一序列.所以,对于T>1000时,可以直接求出LIS,剩下T-=100 ...
- HDU 5226
公式啊,公式啊....TAT 杭电题解.....高中生...... 对于卢卡斯定理,由于p较大,所以不可能按一般的来算,n,m较小,循处理出n!的逆元对p的,然后可以按照卢卡斯定理,降低,对后面的就可 ...
- OpenCV 学习(计算图像的直方图)
OpenCV 计算图像的直方图 计算图像的直方图是图像处理领域一个非经常见的基本操作. OpenCV 中提供了 calcHist 函数来计算图像直方图.只是这个函数说实话挺难用的,研究了好久才掌握了些 ...
- poj 1068 Parencodings(模拟)
转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj ...
- mysql之left join、right join、inner join的区别
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) ...