使用HttpWebRequest发送模拟POST请求

 网页中,如果form的method="POST",这时点击submit按钮可以给服务器发送了一个POST请求,如果method="GET",就是向服务器发送GET请求.
有兴趣可以先看看POST和GET的区别和使用方法。
 

这里,我在ASP.NET中使用两个简单的示例介绍了HttpWebRequest对像和使用HttpWebRequest对像模拟POST请求,HttpWebRequest对HTTP协议进行了完整的封装,对HTTP协议中的Header, Content, Cookie 都做了属性和方法的支持,很容易就能编写出一个模拟浏览器自动登录的程序。

MSDN对HttpWebRequestHttpWebResponse的说明:

这里简要介绍如何使用

HttpWebRequest&HttpWebResponse两个对象与HTTP服务器进行直接交互的过程,

HttpWebRequest类对WebRequest中定义的属性和方法提供支持,在使用HttpWebRequest对象向HTTP服务器发起请求时请不要使用HttpWebRequest对象的构造函数,而应该使用WebRequest.Create()方法来初始化新的HttpWebRequest对象。如果统一资源标识符方案是"http://"或"https://"时,Create()则返回HttpWebResponse对象。

详细过程及代码如下:

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。通常,网站会把它编码的方式放在http header里面,如果没有,我们只能通过对返回二进制值的统计方法来确定它的编码方式。

=====================================================================

=================================

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 = "utf-8";

/// <summary>

/// 1:Post data to url

/// </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>

/// Postdata to url

 /// </summary> 

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

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

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

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

 { 

  //创建httpWebRequest对象

  System.Net.WebRequest webRequest = System.Net.WebRequest.Create(url);

  System.Net.HttpWebRequest httpRequest = webRequest as System.Net.HttpWebRequest;

  if (httpRequest == null)

  {

    throw new ApplicationException(string.Format("Invalid url string: {0}", url));

  }

   //填充httpWebRequest的基本信息

  httpRequest.UserAgent = sUserAgent;

   httpRequest.ContentType = sContentType; 

  httpRequest.Method = "POST";

   //填充并发送要post的内容

  httpRequest.ContentLength = data.Length;

  Stream requestStream = httpRequest.GetRequestStream();

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

  requestStream.Close();

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

  Stream responseStream = null;

  try

  {

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

  }

  catch (Exception e)

  {

    throw e;

  }

  //读取服务器返回信息

  string stringResponse = string.Empty;

  using (StreamReader responseReader = new StreamReader(responseStream,

  Encoding.GetEncoding(sResponseEncoding)))

  {

    stringResponse = responseReader.ReadToEnd();

  }

  responseStream.Close();

  return stringResponse;

}

//调用

string contentHtml = PostDataToUrl("ename=simon&des=87cool", "http://www.87cool.com");

C# HttpWebRequest提交数据方式. 使用 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。

C#
HttpWebRequest提交数据方式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()) 
            { 

               //在这里对接收到的页面内容进行处理 
            }

//附加一个HttpWebRequest的一个小例子

/// <summary>

/// 小例子

2:直接请求,保存远程图片到本地

/// </summary>

static void SaveRemoteImg()

{

   System.Net.HttpWebRequest httpRequest = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create("http://www.87cool.com.logo.gif"); 

  httpRequest.Timeout = 150000;

  System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)httpRequest.GetResponse();

  System.Drawing.Image img = new

  System.Drawing.Bitmap(resp.GetResponseStream());

  img.Save("/87cool.com.gif");

}

=====================================================================

===================

使用 HttpWebRequest 发送模拟 POST 请求的更多相关文章

  1. 使用HttpWebRequest发送自定义POST请求

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

  2. java模拟post请求发送json

    java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...

  3. Fiddler 使用fiddler发送捕获的请求及模拟服务器返回

    使用fiddler发送捕获的请求及模拟服务器返回 by:授客 QQ:1033553122 1.做好相关监听及代理设置 略 2.发送捕获的请求 如图 3.模拟服务器返回 本例的一个目的是,根据服务器返回 ...

  4. Fiddler使用方法之Fiddler显示IP,Fiddler中文乱码解决方法以及Fiddler模拟发送get/post请求

    Fiddler是一个HTTP的调试代理,以代理服务器的方式,监听系统的Http网络数据流动,是我们常用的抓包工具之一 今天为大家分享一下几个使用Fiddler的小技巧 一.Fiddler抓包中文乱码问 ...

  5. C#实现通过HttpWebRequest发送POST请求实现网站自动登陆

    C#实现通过HttpWebRequest发送POST请求实现网站自动登陆   怎样通过HttpWebRequest 发送 POST 请求到一个网页服务器?例如编写个程序实现自动用户登录,自动提交表单数 ...

  6. C# 通过模拟http请求来调用soap、wsdl

    C#调用webservice的方法很多,我说的这种通过http请求模拟来调用的方式是为了解决C#调用java的远程API出现各种不兼容问题. 由于远程API不在我们的控制下,我们只能修改本地的调用代码 ...

  7. HttpClient方式模拟http请求设置头

    关于HttpClient方式模拟http请求,请求头以及其他参数的设置. 本文就暂时不给栗子了,当作简版参考手册吧. 发送请求是设置请求头:header HttpClient httpClient = ...

  8. HttpClientUtil [使用apache httpclient模拟http请求]

    基于httpclient-4.5.2 模拟http请求 以get/post方式发送json请求,并获取服务器返回的json -------------------------------------- ...

  9. [转】HTTP请求流程(二)----Telnet模拟HTTP请求

    转自: http://www.cnblogs.com/stg609/archive/2008/07/06/1237000.html 上一部分"流程简介", 我们大致了解了下HTTP ...

随机推荐

  1. SpringMVC的值传递

    值的传递分为从页面传到到controller和从controller传递到页面,下面分别进行介绍: package com.springmvc.web; import java.util.Map; i ...

  2. [Python笔记][第三章Python选择与循环]

    1月28日学习 Python选择与循环 选择结构 多分枝选择结构 if 表达式 1: 语句块 1 elif 表达式 2: 语句块 2 elif 表达式 3: 语句块 3 ... else : 语句块 ...

  3. .NET 基础串讲

    C#基础 .NET介绍 —计算机发展史 第一代语言:机器语言 0101 第二代语言:汇编语言, 用一些简洁的英文字母.符号串来替代一个特定指令的二进制串 第三代语言:接近于数学语言或人的自然语言,同时 ...

  4. 【Java基础】foreach循环

    从一个小程序说起: class lesson6foreach { public static void main(String[] args) { int array[]={2,3,1,5,4,6}; ...

  5. 数据库学习之ADO.NET五大对象

    1 [ADO.NET]      ado.net 是一种数据访问技术,使得应用程序能够连接到数据存储,并以各种方式操作存储在里面的数据.    2 [ADO.NET五大常用对象]     Connec ...

  6. Angular之作用域与事件(转)

    学习Angular,首先要理解其作用域机制. Angular应用是分层的,主要有三个层面:视图,模型,视图模型.其中,视图很好理解,就是直接可见的界面,模型就是数据,那么视图模型是什么呢?是一种把数据 ...

  7. Spring 入门 AOP

    通过一个小例子演视怎么使用 Spring 现实面向切面编程. 导入 Spring 所需要的包 spring-framework-2.5.6 版需要导入以下包: 1.----- spring.jar 2 ...

  8. Java-----instanceof、isInstance、isAssignableFrom

    转载自:http://blog.csdn.net/hekewangzi/article/details/51956170

  9. 杭电OJ—— 1084 What Is Your Grade?

    What Is Your Grade? Problem Description “Point, point, life of student!” This is a ballad(歌谣)well kn ...

  10. tp其他功能

    数据缓存 在ThinkPHP中进行缓存操作,一般情况下并不需要直接操作缓存类,因为系统内置对缓存操作进行了封装,3.1版本推荐的数据缓存方法是cache方法,基本的用法是:(3.1.2版本cache方 ...