随笔-53  评论-45  文章-0  trackbacks-5

使用 HttpWebRequest 向网站提交数据

HttpWebRequest 是 .net 基类库中的一个类,在命名空间 System.Net 下面,用来使用户通过 HTTP 协议和服务器交互。 

HttpWebRequest 对 HTTP 协议进行了完整的封装,对 HTTP 协议中的 Header, Content, Cookie 都做了属性和方法的支持,很容易就能编写出一个模拟浏览器自动登录的程序。 

程序使用 HTTP 协议和服务器交互主要是进行数据的提交,通常数据的提交是通过 GET 和 POST 两种方式来完成,下面对这两种方式进行一下说明: 

1. GET 方式。 GET 方式通过在网络地址附加参数来完成数据的提交,比如在地址 http://www.google.com/webhp?hl=zh-CN 中,前面部分 http://www.google.com/webhp 表示数据提交的网址,后面部分 hl=zh-CN 表示附加的参数,其中 hl 表示一个键(key), zh-CN 表示这个键对应的值(value)。程序代码如下: 

HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "http://www.google.com/webhp?hl=zh-CN" );
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
   //在这里对接收到的页面内容进行处理


2. POST 方式。 POST 方式通过在页面内容中填写参数的方法来完成数据的提交,参数的格式和 GET 方式一样,是类似于 hl=zh-CN&newwindow=1 这样的结构。程序代码如下: 

string param = "hl=zh-CN&newwindow=1";
byte[] bs = Encoding.ASCII.GetBytes(param);

HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "http://www.google.com/intl/zh-CN/" );
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = bs.Length;

using (Stream reqStream = req.GetRequestStream())
{
   reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse wr = req.GetResponse())
{
   //在这里对接收到的页面内容进行处理


在上面的代码中,我们访问了 www.google.com 的网址,分别以 GET 和 POST 方式提交了数据,并接收了返回的页面内容。然而,如果提交的参数中含有中文,那么这样的处理是不够的,需要对其进行编码,让对方网站能够识别。 

3. 使用 GET 方式提交中文数据。 GET 方式通过在网络地址中附加参数来完成数据提交,对于中文的编码,常用的有 gb2312 和 utf8 两种,用 gb2312 方式编码访问的程序代码如下: 

Encoding myEncoding = Encoding.GetEncoding("gb2312");
string address = "http://www.baidu.com/s?" + HttpUtility.UrlEncode("参数一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(address);
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
   //在这里对接收到的页面内容进行处理


在上面的程序代码中,我们以 GET 方式访问了网址 http://www.baidu.com/s ,传递了参数“参数一=值一”,由于无法告知对方提交数据的编码类型,所以编码方式要以对方的网站为标准。常见的网站中, www.baidu.com (百度)的编码方式是 gb2312, www.google.com (谷歌)的编码方式是 utf8。 

4. 使用 POST 方式提交中文数据。 POST 方式通过在页面内容中填写参数的方法来完成数据的提交,由于提交的参数中可以说明使用的编码方式,所以理论上能获得更大的兼容性。用 gb2312 方式编码访问的程序代码如下: 

Encoding myEncoding = Encoding.GetEncoding("gb2312");
string param = HttpUtility.UrlEncode("参数一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding) + "&" + HttpUtility.UrlEncode("参数二", myEncoding) + "=" + HttpUtility.UrlEncode("值二", myEncoding);

byte[] postBytes = Encoding.ASCII.GetBytes(param);

HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "http://www.baidu.com/s" );
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded;charset=gb2312";
req.ContentLength = postBytes.Length;

using (Stream reqStream = req.GetRequestStream())
{
   reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse wr = req.GetResponse())
{
   //在这里对接收到的页面内容进行处理


从上面的代码可以看出, POST 中文数据的时候,先使用 UrlEncode 方法将中文字符转换为编码后的 ASCII 码,然后提交到服务器,提交的时候可以说明编码的方式,用来使对方服务器能够正确的解析。 

以上列出了客户端程序使用 HTTP 协议与服务器交互的情况,常用的是 GET 和 POST 方式。现在流行的 WebService 也是通过 HTTP 协议来交互的,使用的是 POST 方法。与以上稍有所不同的是, WebService 提交的数据内容和接收到的数据内容都是使用了 XML 方式编码。所以, HttpWebRequest 也可以使用在调用 WebService 的情况下。
posted on 2006-11-17 22:39 hzman 阅读(20225) 评论(18) 编辑 收藏

评论:
#1楼 2007-04-11 09:24 | banping[未注册用户]
请问下,如何表示不同的提交按钮呢?一个form不同的提交按钮返回的结果是不一样的.
 回复 引用   
#2楼 2007-12-03 15:07 | yanpeng[未注册用户]
中华康网,致力于打造最权威,全面,专业的健康资讯网站,全心全意为网友提供健康服务.如果您感到身体不适,或者想了解健康相关的信息,希望在这里您可以找到答案.如果您觉得本站还不错,记得要和朋友一起分享哦
 回复 引用   
#3楼 2008-04-13 18:14 | 凯太泵业[未注册用户]
上海凯太泵业制造有限公司位于上海西北部一华新工业区,是生产各种离心泵、容积式泵、泵类附属产品及电气控制柜的专业生产企业。主要以配套为主,集设计、制造、销售为一体。产品广泛应用于民用建筑给排水、暧通制冷、排污、消防以及化工、制药等领域。
 回复 引用   
#4楼 2008-05-02 11:28 | M[未注册用户]
--引用--------------------------------------------------
banping: 请问下,如何表示不同的提交按钮呢?一个form不同的提交按钮返回的结果是不一样的.
--------------------------------------------------------
每个FORM只有一个提交按钮。在FORM的ACTION属性里面

 回复 引用   
#5楼 2008-05-11 16:06 | 王志远[未注册用户]
请问下,如何表示不同的提交按钮呢?一个form不同的提交按钮返回的结果是不一样的, 我的站是http://wwwanlisi.com
 回复 引用   
#6楼 2008-06-26 15:06 | vicholi[未注册用户]
不错,介绍一下怎样提交按钮值就更完美啦
 回复 引用   
#7楼 2008-07-02 14:26 | sinx[未注册用户]
如果经过移动网关10.0.172:80,又怎样post?
 回复 引用   
#8楼 2009-01-14 17:49 | SZDingHaiFeng[未注册用户]
提交不同的按钮,把SubmitName=SubmitValue一起提交就行了
 回复 引用   
#9楼 2009-02-11 15:46 | www.llren.net[未注册用户]
www.llren.net
 回复 引用   
#10楼 2009-02-12 19:19 | fdsfd[未注册用户]
好日子深圳搬家公司是一家正规,大型的深圳搬家公司,为广大深圳市民提供深圳搬家服务, 深圳搬写字楼服务,深圳搬钢琴服务等一切搬迁服务,本深圳搬家公司为了更好的服务深圳搬家行业,特地培训了150名专业搬运工人,30名拆装能手,24小时服务深圳搬家行业,欢迎来电咨询。

 回复 引用   
#13楼 2009-07-15 08:33 | dsfwq[未注册用户]
<a href="http://www.weilaijie.com">不错</a>
 回复 引用   
#14楼 2009-09-21 17:54 | jimyt[未注册用户]
不错谢谢分享.......

http://www.ikexin.com

 回复 引用   
#15楼 2010-12-05 23:53 | 僵尸之王      
正好用到,呵呵,学习了
 回复 引用 查看   
#16楼 2011-04-07 16:06 | 哲&思      
请问楼主,在接受页面怎么接收提交过来的参数呢?比如我的页面是http://www.xxx.com/index.aspx,而提交者用HttpWebRequest请求的格式是:http://www.xxx.com/index.aspx?name=zhesi,那我怎么在index.aspx中接收name的值呢?我目前只知道通过Request.InputStream来获取,楼主知道有其他方法吗?
 回复 引用 查看   
#17楼 2011-08-23 09:36 | yuxh81      
不错,感觉就是少了带有cookie数据的提交
 回复 引用 查看   
#18楼 2011-09-21 12:43 | 华-子      
学习一下!
 回复 引用 查看   
启用自己的博客,欢迎大家继续光临 http://www.dafengshu.cn
昵称:hzman
园龄:5年5个月
粉丝:3
关注:0
<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

搜索

 
 

常用链接

随笔档案(53)

友情链接

最新评论

阅读排行榜

评论排行榜

推荐排行榜