使用HttpWebRequest发送自定义POST请求(以http方式推送消息)

        平时用浏览器看网页的时候,点击一下submit按钮的时候其实就是给服务器发送了一个POST请求。但是如何在自己的C#程序里面实现 类似的功能呢?本文给出了一个简单的范例,可以实现类似的和web server之间的POST通讯。通过程序发送POST的过程如下所示:

1. 创建httpWebRequest对象

HttpWebRequest不能直接通过new来创建,只能通过WebRequest.Create(url)的方式来获得。
WebRequest是获得一些列应用层协议对象的一个统一的入口(工厂模式),它根据参数的协议来确定最终创建的对象类型。所以我们的程序里面有一个对 返回对象的类型进行测试的过程。

2. 初始化HttpWebRequest对象

这个过程提供一些http请求常用的属性:agentstring,contenttype等其中agentstring比较有意思,它是用来识别 你用的浏览器名字的,通过设置这个属性你可以欺骗服务器你是一个IE,firefox甚至是mac里面的safari。很多认真设计的网站都会根据这个值 来返回对用户浏览器特别优化过的代码。

3. 附加要POST给服务器的数据到HttpWebRequest对象

附加POST数据的过程比较特殊,它并没有提供一个属性给用户存取,需要写入HttpWebRequest对象提供的一个stream里面。

4. 读取服务器的返回信息

读取服务器返回的时候,要注意返回数据的encoding。如果我们提供的解码类型不对会造成乱码。比较常见的是utf-8和gb2312之间的混 淆,据我测试,国内的主机一般都是gb2312编码的。一般设计良好的网站会把它编码的方式放在返回的http header里面,但是也有不少网站根本没有,我们只能通过一个对返回二进制值的统计方法来确定它的编码方式。

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Text; 
  4. using System.Net; 
  5. using System.IO; 
  6.   
  7. namespace SimpleWebRequest 
  8.     class Program 
  9.     { 
  10.         static void Main(string[] args) 
  11.         { 
  12.             Console.WriteLine( 
  13.                 PostDataToUrl("test", "http://www.microsoft.com") 
  14.                 ); 
  15.         } 
  16.   
  17.         /// <summary> 
  18.         /// Post data到url 
  19.         /// </summary> 
  20.         /// <param name="data"& gt;要post的数据</param> 
  21.         /// <param name="url">目标 url</param> 
  22.         /// <returns> 服务器响应</returns> 
  23.         static string PostDataToUrl(string data, string url) 
  24.         { 
  25.             Encoding encoding = Encoding.GetEncoding(sRequestEncoding); 
  26.             byte[] bytesToPost = encoding.GetBytes(data); 
  27.             return PostDataToUrl(bytesToPost, url); 
  28.         } 
  29.   
  30.         /// <summary> 
  31.         /// Post data到url 
  32.         /// </summary> 
  33.         /// <param name="data">要 post的数据</param> 
  34.         /// <param name="url"& gt;目标url</param> 
  35.         /// <returns>服务器响应< /returns> 
  36.         static string PostDataToUrl(byte[] data, string url) 
  37.         { 
  38.             #region 创 建httpWebRequest对象 
  39.             WebRequest webRequest = WebRequest.Create(url); 
  40.             HttpWebRequest httpRequest = webRequest as HttpWebRequest; 
  41.             if (httpRequest == null) 
  42.             { 
  43.                 throw new ApplicationException( 
  44.                     string.Format("Invalid url string: {0}", url) 
  45.                     ); 
  46.             } 
  47.             #endregion 
  48.   
  49.             #region 填充 httpWebRequest的基本信息 
  50.             httpRequest.UserAgent = sUserAgent; 
  51.             httpRequest.ContentType = sContentType; 
  52.             httpRequest.Method = "POST"; 
  53.             #endregion 
  54.   
  55.             #region 填充要post的内容 
  56.             httpRequest.ContentLength = data.Length; 
  57.             Stream requestStream = httpRequest.GetRequestStream(); 
  58.             requestStream.Write(data, 0, data.Length); 
  59.             requestStream.Close(); 
  60.             #endregion 
  61.   
  62.             #region 发 送post请求到服务器并读取服务器返回信息 
  63.             Stream responseStream; 
  64.             try 
  65.             { 
  66.                 responseStream = httpRequest.GetResponse().GetResponseStream(); 
  67.             } 
  68.             catch(Exception e) 
  69.             { 
  70.                 // log error 
  71.                 Console.WriteLine( 
  72.                     string.Format("POST操作发生异常:{0}", e.Message) 
  73.                     ); 
  74.                 throw e; 
  75.             } 
  76.             #endregion 
  77.   
  78.             #region 读 取服务器返回信息 
  79.             string stringResponse = string.Empty; 
  80.             using(StreamReader responseReader = 
  81.                 new StreamReader(responseStream, Encoding.GetEncoding(sResponseEncoding))) 
  82.             { 
  83.                 stringResponse = responseReader.ReadToEnd(); 
  84.             } 
  85.             responseStream.Close(); 
  86.             #endregion 
  87.             return stringResponse; 
  88.         } 
  89.   
  90.         const string sUserAgent = 
  91.             "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; 
  92.         const string sContentType = 
  93.             "application/x-www-form-urlencoded"; 
  94.         const string sRequestEncoding = "ascii"; 
  95.         const string sResponseEncoding = "gb2312"; 
  96.     } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值