注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

软件大铺的博客

IT技术共享

 
 
 

日志

 
 

使用HttpWebRequest发送自定义POST请求  

2012-02-12 20:21:18|  分类: .Net |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

平时用浏览器看网页的时候,点击一下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里面,但是也有不少网站根本没有,我们只能通过一个对返回二进制值的统计方法来确定它的编码方式。

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.IO;

 

namespace SimpleWebRequest

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine(

                PostDataToUrl("test", "http://www.microsoft.com")

                );

        }

 

        /// <summary>

        /// Post dataurl

        /// </summary>

        /// <param name="data">post的数据</param>

        /// <param name="url">目标url</param>

        /// <returns>服务器响应</returns>

        static string PostDataToUrl(string data, string url)

        {

            Encoding encoding = Encoding.GetEncoding(sRequestEncoding);

            byte[] bytesToPost = encoding.GetBytes(data);

            return PostDataToUrl(bytesToPost, url);

        }

 

        /// <summary>

        /// Post dataurl

        /// </summary>

        /// <param name="data">post的数据</param>

        /// <param name="url">目标url</param>

        /// <returns>服务器响应</returns>

        static string PostDataToUrl(byte[] data, string url)

        {

            #region 创建httpWebRequest对象

            WebRequest webRequest = WebRequest.Create(url);

            HttpWebRequest httpRequest = webRequest as HttpWebRequest;

            if (httpRequest == null)

            {

                throw new ApplicationException(

                    string.Format("Invalid url string: {0}", url)

                    );

            }

            #endregion

 

            #region 填充httpWebRequest的基本信息

            httpRequest.UserAgent = sUserAgent;

            httpRequest.ContentType = sContentType;

            httpRequest.Method = "POST";

            #endregion

 

            #region 填充要post的内容

            httpRequest.ContentLength = data.Length;

            Stream requestStream = httpRequest.GetRequestStream();

            requestStream.Write(data, 0, data.Length);

            requestStream.Close();

            #endregion

 

            #region 发送post请求到服务器并读取服务器返回信息

            Stream responseStream;

            try

            {

                responseStream = httpRequest.GetResponse().GetResponseStream();

            }

            catch(Exception e)

            {

                // log error

                Console.WriteLine(

                    string.Format("POST操作发生异常:{0}", e.Message)

                    );

                throw e;

            }

            #endregion

 

            #region 读取服务器返回信息

            string stringResponse = string.Empty;

            using(StreamReader responseReader =

                new StreamReader(responseStream, Encoding.GetEncoding(sResponseEncoding)))

            {

                stringResponse = responseReader.ReadToEnd();

            }

            responseStream.Close();

            #endregion

            return stringResponse;

        }

 

        const string sUserAgent =

            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";

        const string sContentType =

            "application/x-www-form-urlencoded";

        const string sRequestEncoding = "ascii";

        const string sResponseEncoding = "gb2312";

    }

}

 

转自:http://www.cnblogs.com/ThomasNet/archive/2007/09/03/879331.html

  评论这张
 
阅读(819)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017