C#中使用 HttpWebRequest 向网站提交数据

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

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

下面是HttpWebRequest的一些属性,这些属性对于轻量级的自动化测试程序是非常重要的。

AllowAutoRedirect:获取或设置一个值,该值指示请求是否应跟随重定向响应。

CookieContainer:获取或设置与此请求关联的cookie。

Credentials:获取或设置请求的身份验证信息。

KeepAlive:获取或设置一个值,该值指示是否与 Internet 资源建立持久性连接。

MaximumAutomaticRedirections:获取或设置请求将跟随的重定向的最大数目。

Proxy:获取或设置请求的代理信息。

SendChunked:获取或设置一个值,该值指示是否将数据分段发送到 Internet 资源。

Timeout:获取或设置请求的超时值。

UserAgent:获取或设置 User-agent HTTP 标头的值

程序使用 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 的情况下。

C#中使用 HttpWebRequest 向网站提交数据的实例代码:

using System;
using System.IO;
using System.Net;
using System.Xml;

namespace Better517Na.HttpHelper
{
    /// <summary>
    /// WebCommon类
    /// </summary>
    public class WebCommon
    {
        /// <summary>
        /// 获取请求结果
        /// </summary>
        /// <param name="requestUrl">请求地址</param>
        /// <param name="refere">请求源</param>
        /// <param name="timeout">超时时间(秒)</param>
        /// <param name="isPost">是否post提交</param>
        /// <param name="msg">抛出的错误信息</param>
        /// <param name="parameters">参数列表</param>
        /// <returns>返回请求结果</returns>
        public static string HttpWebRequest(string requestUrl, string refere, int timeout, bool isPost, out string msg, params string[] parameters)
        {
            return HttpWebRequest(requestUrl, refere, timeout, isPost, "utf-8", out msg, parameters);
        }

        /// <summary>
        /// 获取请求结果
        /// </summary>
        /// <param name="requestUrl">请求地址</param>
        /// <param name="refere">请求源</param>
        /// <param name="timeout">超时时间(秒)</param>
        /// <param name="isPost">是否post提交</param>
        /// <param name="encoding">编码格式 例如:utf-8</param>
        /// <param name="msg">抛出的错误信息</param>
        /// <param name="parameters">参数列表</param>
        /// <returns>返回请求结果</returns>
        public static string HttpWebRequest(string requestUrl, string refere, int timeout, bool isPost, string encoding, out string msg, params string[] parameters)
        {
            msg = string.Empty;
            string result = string.Empty;
            string ps = string.Empty;
            try
            {
                // 构造入参
                if (parameters != null && parameters.Length >= 1)
                {
                    ps = string.Join("&", parameters);
                }

                // 构造url
                string urlPath = string.Empty;
                if (isPost)
                {
                    urlPath = requestUrl;
                }
                else
                {
                    if (requestUrl.IndexOf("?") < 0)
                    {
                        urlPath = string.Format("{0}?{1}", requestUrl, ps);
                    }
                    else
                    {
                        urlPath = requestUrl;
                    }
                }

                byte[] bytes = System.Text.Encoding.GetEncoding(encoding).GetBytes(ps);

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlPath);
                request.Referer = refere;
                request.Timeout = timeout * 1000;
                request.Method = isPost ? "POST" : "GET";
                request.Credentials = CredentialCache.DefaultCredentials;

                if (isPost)
                {
                    request.ContentType = "application/x-www-form-urlencoded";
                    request.ContentLength = bytes.Length;

                    Stream requestStream = request.GetRequestStream();
                    requestStream.Write(bytes, 0, bytes.Length);
                    requestStream.Close();
                }

                // 获取Internet资源的响应
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // 从Internet资源返回数据流
                Stream responseStream = response.GetResponseStream();
                if (responseStream != null)
                {
                    // 读取数据流
                    StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding(encoding));

                    // 读取数据
                    result = reader.ReadToEnd();
                    reader.Close();
                    responseStream.Close();
                    request.Abort();
                    response.Close();
                    return result.Trim();
                }
            }
            catch (Exception ex)
            {
                msg = ex.Message + ex.StackTrace;
            }

            return result;
        }
    }
}

控制台调用:

static void Main(string[] args)
        {
            string result = string.Empty;

            string url = "http://15013189090.oicp.net:8888/XXXX/XXXXX.jsp";
            List<string> parameters = new List<string>();

            // 读取文件
            FileStream aFile = new FileStream("xml.txt", FileMode.Open);
            StreamReader sr = new StreamReader(aFile);
            string str = sr.ReadToEnd();
            sr.Close();

            // 发送请求
            parameters.Add("orderXml=" + str);
            string msg = string.Empty;
            result = WebCommon.HttpWebRequest(url, null, 50, true, out msg, parameters.ToArray());

            Console.WriteLine(result);
        }

通过WebRequest创建一个请求后,可以通过请求来获取HttpWebResponse。然后通过HttpWebResponse.StatusCode来判断当前错误,也可以得到一些精确的消息。

代码详细列表:


成员名称


说明


Continue


等效于 HTTP 状态 100。Continue指示客户端可能继续其请求。


SwitchingProtocols


等效于 HTTP 状态 101。SwitchingProtocols指示正在更改协议版本或协议。


OK


等效于 HTTP 状态 200。OK指示请求成功,且请求的信息包含在响应中。这是最常接收的状态代码。


Created


等效于 HTTP 状态 201。Created指示请求导致在响应被发送前创建新资源。


Accepted


等效于 HTTP 状态 202。Accepted指示请求已被接受做进一步处理。


NonAuthoritativeInformation


等效于 HTTP 状态 203。NonAuthoritativeInformation指示返回的元信息来自缓存副本而不是原始服务器,因此可能不正确。


NoContent


等效于 HTTP 状态 204。NoContent指示已成功处理请求并且响应已被设定为无内容。


ResetContent


等效于 HTTP 状态 205。ResetContent指示客户端应重置(或重新加载)当前资源。


PartialContent


等效于 HTTP 状态 206。PartialContent指示响应是包括字节范围的 GET 请求所请求的部分响应。


MultipleChoices


等效于 HTTP 状态 300。MultipleChoices指示请求的信息有多种表示形式。默认*作是将此状态视为重定向,并遵循与此响应关联的 Location 头的内容。


Ambiguous


等效于 HTTP 状态 300。Ambiguous指示请求的信息有多种表示形式。默认*作是将此状态视为重定向,并遵循与此响应关联的 Location 头的内容。


MovedPermanently


等效于 HTTP 状态 301。MovedPermanently指示请求的信息已移到Location 头中指定的 URI 处。接收到此状态时的默认*作为遵循与响应关联的Location 头。


Moved


等效于 HTTP 状态 301。Moved指示请求的信息已移到 Location 头中指定的URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求将使用 GET 方法。


Found


等效于 HTTP 状态 302。Found指示请求的信息位于 Location 头中指定的URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求将使用 GET 方法。


Redirect


等效于 HTTP 状态 302。Redirect指示请求的信息位于 Location 头中指定的URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求将使用 GET 方法。


SeeOther


等效于 HTTP 状态 303。作为 POST 的结果,SeeOther将客户端自动重定向到 Location 头中指定的 URI。用 GET 生成对 Location 头所指定的资源的请求。


RedirectMethod


等效于 HTTP 状态 303。作为 POST 的结果,RedirectMethod将客户端自动重定向到 Location 头中指定的 URI。用 GET 生成对 Location 头所指定的资源的请求。


NotModified


等效于 HTTP 状态 304。NotModified指示客户端的缓存副本是最新的。未传输此资源的内容。


UseProxy


等效于 HTTP 状态 305。UseProxy指示请求应使用位于 Location 头中指定的URI 的代理服务器。


Unused


等效于 HTTP 状态 306。Unused是未完全指定的 HTTP/1.1 规范的建议扩展。


TemporaryRedirect


等效于 HTTP 状态 307。TemporaryRedirect指示请求信息位于 Location 头中指定的 URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location头。原始请求方法为 POST 时,重定向的请求还将使用 POST 方法。


RedirectKeepVerb


等效于 HTTP 状态 307。RedirectKeepVerb指示请求信息位于 Location 头中指定的 URI 处。接收到此状态时的默认*作为遵循与响应关联的 Location 头。原始请求方法为 POST 时,重定向的请求还将使用 POST 方法。


BadRequest


等效于 HTTP 状态 400。BadRequest指示服务器未能识别请求。如果没有其他适用的错误,或者如果不知道准确的错误或错误没有自己的错误代码,则发送BadRequest


Unauthorized


等效于 HTTP 状态 401。Unauthorized指示请求的资源要求身份验证。WWW-Authenticate 头包含如何执行身份验证的详细信息。


PaymentRequired


等效于 HTTP 状态 402。保留PaymentRequired以供将来使用。


Forbidden


等效于 HTTP 状态 403。Forbidden指示服务器拒绝满足请求。


NotFound


等效于 HTTP 状态 404。NotFound指示请求的资源不在服务器上。


MethodNotAllowed


等效于 HTTP 状态 405。MethodNotAllowed指示请求的资源上不允许请求方法(POST 或 GET)。


NotAcceptable


等效于 HTTP 状态 406。NotAcceptable指示客户端已用 Accept 头指示将不接受资源的任何可用表示形式。


ProxyAuthenticationRequired


等效于 HTTP 状态 407。ProxyAuthenticationRequired指示请求的代理要求身份验证。Proxy-authenticate 头包含如何执行身份验证的详细信息。


RequestTimeout


等效于 HTTP 状态 408。RequestTimeout指示客户端没有在服务器期望请求的时间内发送请求。


Conflict


等效于 HTTP 状态 409。Conflict指示由于服务器上的冲突而未能执行请求。


Gone


等效于 HTTP 状态 410。Gone指示请求的资源不再可用。


LengthRequired


等效于 HTTP 状态 411。LengthRequired指示缺少必需的 Content-length头。


PreconditionFailed


等效于 HTTP 状态 412。PreconditionFailed指示为此请求设置的条件失败,且无法执行此请求。条件是用条件请求标头(如 If-Match、If-None-Match 或 If-Unmodified-Since)设置的。


RequestEntityTooLarge


等效于 HTTP 状态 413。RequestEntityTooLarge指示请求太大,服务器无法处理。


RequestUriTooLong


等效于 HTTP 状态 414。RequestUriTooLong指示 URI 太长。


UnsupportedMediaType


等效于 HTTP 状态 415。UnsupportedMediaType指示请求是不支持的类型。


RequestedRangeNotSatisfiable


等效于 HTTP 状态 416。RequestedRangeNotSatisfiable指示无法返回从资源请求的数据范围,因为范围的开头在资源的开头之前,或因为范围的结尾在资源的结尾之后。


ExpectationFailed


等效于 HTTP 状态 417。ExpectationFailed指示服务器未能符合 Expect 头中给定的预期值。


InternalServerError


等效于 HTTP 状态 500。InternalServerError指示服务器上发生了一般错误。


NotImplemented


等效于 HTTP 状态 501。NotImplemented指示服务器不支持请求的函数。


BadGateway


等效于 HTTP 状态 502。BadGateway指示中间代理服务器从另一代理或原始服务器接收到错误响应。


ServiceUnavailable


等效于 HTTP 状态 503。ServiceUnavailable指示服务器暂时不可用,通常是由于过多加载或维护。


GatewayTimeout


等效于 HTTP 状态 504。GatewayTimeout指示中间代理服务器在等待来自另一个代理或原始服务器的响应时已超时。


HttpVersionNotSupported


等效于 HTTP 状态 505。HttpVersionNotSupported指示服务器不支持请求的 HTTP 版本。

参考资料:

  http://www.cnblogs.com/webman/archive/2006/11/17/564106.html

  http://blog.csdn.net/sjj2011/article/details/7822393

时间: 2024-10-24 00:09:56

C#中使用 HttpWebRequest 向网站提交数据的相关文章

使用 HttpWebRequest 向网站提交数据(转)

使用 HttpWebRequest 向网站提交数据 http://www.blogjava.net/killme2008/archive/2011/05/20/105023.html 转自:http://www.cnblogs.com/webman/archive/2006/11/17/564106.html HttpWebRequest 是 .net 基类库中的一个类,在命名空间 System.Net 下面,用来使用户通过 HTTP 协议和服务器交互. HttpWebRequest 对 HTT

Android提交数据到服务器的两种方式四种方法

Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方式向服务器提交数据的方法. /** * @author Dylan * 本类封装了Android中向web服务器提交数据的两种方式四种方法 */ public class SubmitDataByHttpClientAndOrdinaryWay { /** * 使用get请求以普通方式提交数据 * @param map 传递进来的数据,以map的形式进行了封装 * @p

servlet自动获取前端页面提交数据

servlet自动获取前端页面jsp提交数据 以下是本人在学习过程中,因前端页面提交参数过多,后台servlet封装实体类过于麻烦而写的一个工具类,应用于jsp/servlet数据提交后,基于MVC+MyBatis进行数据持久化的过程.这里只介绍页面到servlet(controller)提交数据封装对象的过程,MVC+MyBatis访问数据库不在这里介绍. 1.前端页面及代码 1)前端表单页面构建(用于测试简单构建的页面有点丑陋哦~) 2)前端jsp页面代码   这里使用了Ajax异步 get

C# httpwebrequest批量提交数据到网站。

非新文,由自己以前在baidu网站转来的.(现在百度的博客不喜欢,转来这存档.很久以前的工作笔记了) 因为工作需要要将大致300多条数据提交到网站,而网站在提交 错数据后无法正常进入相应的数据页面进行修改, 不得己自己动手开发一个. 关键字:httpwebrequest, httpwebrespone, excel ,datagradview,httpwatch.cookie 首先下载一个httpwatch安装,在IE中截获提交信息 登录流: POST /index.php/Public/che

C# HttpWebRequest提交数据方式浅析

原文:http://developer.51cto.com/art/200909/149995.htmC# HttpWebRequest提交数据方式其实就是GET和POST两种,那么具体的实现以及操作注意事项是什么呢?那么本文就向你详细介绍C# HttpWebRequest提交数据方式的这两种利器. AD:2014WOT全球软件技术峰会北京站 课程视频发布 C# HttpWebRequest提交数据方式学习之前我们先来看看什么是HttpWebRequest,它是 .net 基类库中的一个类,在命

【转】C# HttpWebRequest提交数据方式

[转]C# HttpWebRequest提交数据方式 HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.它们支持一系列有用的属性.这两个类位 于System.Net命名空间,默认情况下这个类对于控制台程序来说是可访问的.请注意,HttpWebRequest对象不是利用new关键字通过构 造函数来创建的,而是利用工厂机制(factory mechanism)通过Create()方法来创建的.另外,你可能预计需要显式地调用一个"Send"

表单提交时如何将错误信息传递到页面中,并且保存原来提交数据

曾经何时,你还有我或许都在困惑,如何方便的将验证不通过的表单信息再返回到前台页面,例如我注册一个账号,辛辛苦苦填写了N多项,一个格式验证没有通过,一切都需要充填,虽然Ajax可以解决这个问题,但是我们总不能把所有表单提交都弄成ajax,更何况有若干人就是没事把javascript给禁止了.哎哎,好了解决方案来了,下面以用户登录为例,说说我的解决方案. 服务器端用nodejs实现: login.html 简单的提交表单 <form action="" id="loginF

JavaWeb开发中form、ajax提交数据Model转化

JavaWeb开发中form.ajax提交数据Model转化 问题 最近学习MongoDB数据库,作为java开发的我,当然需要做个小的web程序来测试一番了.在html中我采取ajax提交方式,因为我要模拟各种类型的数据,基础数据类型.数组.对象等.然而,最终发现了个不同的地方:Form和ajax提交数据,在HttpServletRequest中尽然参数名有所不同. 数据类型 form ajax 基础数据 para=value para=value 数组 para[]={"aaa",

asp.net中http提交数据所遇到的那些坑

http提交数据有两种形式,get和post,不知道的同学请联系度娘. 1.aspnet:MaxHttpCollectionKeys 业务场景:业务很简单,手机端读取本地通讯录,将所有通讯录提交到后台,后台进行业务过滤,返回已属于当前用户好友所在的企业 服务端接口定义如下:         [HttpPost]public List<string> IsInEnt([FromBody]List<string> mobilePhs) 问题描述:如果提交给后台的通讯录超过一定数量,后台