使用 HttpWebRequest 发送模拟 POST 请求
使用HttpWebRequest发送模拟POST请求
这里,我在ASP.NET中使用两个简单的示例介绍了HttpWebRequest对像和使用HttpWebRequest对像模拟POST请求,HttpWebRequest对HTTP协议进行了完整的封装,对HTTP协议中的Header, Content, Cookie 都做了属性和方法的支持,很容易就能编写出一个模拟浏览器自动登录的程序。
MSDN对HttpWebRequest和HttpWebResponse的说明:
这里简要介绍如何使用
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
/// <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));
}
httpRequest.UserAgent = sUserAgent;
httpRequest.Method = "POST";
httpRequest.ContentLength = data.Length;
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
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()
{
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 请求的更多相关文章
- 使用HttpWebRequest发送自定义POST请求
		
平时用浏览器看网页的时候,点击一下submit按钮的时候其实就是给服务器发送了一个POST请求.但是如何在自己的C#程序里面实现类似的功能呢?本文给出了一个简单的范例,可以实现类似的和web serv ...
 - java模拟post请求发送json
		
java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...
 - Fiddler 使用fiddler发送捕获的请求及模拟服务器返回
		
使用fiddler发送捕获的请求及模拟服务器返回 by:授客 QQ:1033553122 1.做好相关监听及代理设置 略 2.发送捕获的请求 如图 3.模拟服务器返回 本例的一个目的是,根据服务器返回 ...
 - Fiddler使用方法之Fiddler显示IP,Fiddler中文乱码解决方法以及Fiddler模拟发送get/post请求
		
Fiddler是一个HTTP的调试代理,以代理服务器的方式,监听系统的Http网络数据流动,是我们常用的抓包工具之一 今天为大家分享一下几个使用Fiddler的小技巧 一.Fiddler抓包中文乱码问 ...
 - C#实现通过HttpWebRequest发送POST请求实现网站自动登陆
		
C#实现通过HttpWebRequest发送POST请求实现网站自动登陆 怎样通过HttpWebRequest 发送 POST 请求到一个网页服务器?例如编写个程序实现自动用户登录,自动提交表单数 ...
 - C# 通过模拟http请求来调用soap、wsdl
		
C#调用webservice的方法很多,我说的这种通过http请求模拟来调用的方式是为了解决C#调用java的远程API出现各种不兼容问题. 由于远程API不在我们的控制下,我们只能修改本地的调用代码 ...
 - HttpClient方式模拟http请求设置头
		
关于HttpClient方式模拟http请求,请求头以及其他参数的设置. 本文就暂时不给栗子了,当作简版参考手册吧. 发送请求是设置请求头:header HttpClient httpClient = ...
 - HttpClientUtil [使用apache httpclient模拟http请求]
		
基于httpclient-4.5.2 模拟http请求 以get/post方式发送json请求,并获取服务器返回的json -------------------------------------- ...
 - [转】HTTP请求流程(二)----Telnet模拟HTTP请求
		
转自: http://www.cnblogs.com/stg609/archive/2008/07/06/1237000.html 上一部分"流程简介", 我们大致了解了下HTTP ...
 
随机推荐
- Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessException
			
异常Log: Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessE ...
 - 有关docker新版的icc、iptables的一个巨坑
			
之前玩过docker的icc=false.iptables=true 按照这两个参数配置之后,想指定两个特定的容器通讯,直接用--link即可. 但最近我在下载了1.12新版的docker,这个不奏效 ...
 - httpwatch 9.3怎么在ie 8上看不到
			
首先,确认HttpWatch Basic加载项是否启动:打开IE,单击工具图标并选择管理加载项.确认HttpWatch Basic的状态是已启用,点击关闭.之后打开某个网页,在页面空白处右击选择Htt ...
 - 在Android Studio中进行单元测试和UI测试
			
本篇教程翻译自Google I/O 2015中关于测试的codelab,掌握科学上网的同学请点击这里阅读:Unit and UI Testing in Android Studio.能力有限,如有翻译 ...
 - Python3.5 入门学习记录——变量类型
			
前面介绍了如何下载和安装Python3.5的环境,安装好了后开始进行练习,仍然是最基础的使用Python解释器进行Coding,由于我也是初学Python,也是根据网上其他的教程一点一点练习,然后归纳 ...
 - css模板之 web模板一
			
效果 <html><head><style type="text/css">div.container{width:100%;margin:0p ...
 - CAD2014以上版本不信任加载项解决方法
			
前一段时间做CAD插件支持版本升级遇到了一个很棘手的问题,CAD2014以上版本增加了受信任功能,每次用程序启动CAD并加载arx文件时都弹出对话框询问是否加载 我的解决方法如下:(仅供参考) 读取注 ...
 - study notes: high performance linux server programming
			
1:linux网络API分为:socker地址API,socker基础API,网络信息API 1,socker地址API:包含IP地址和端口(ip, port).表示TCP通信的一端. 2,socke ...
 - gdb零散学习心得。
			
引用: 记录学习心得.未来将统一整理. 一.基础知识 1:细节整理. 1,启动GDB的前置要求. 1)使用gcc/g++时,添加-g的指令.例如:g++ -g test.cpp -o test 2)如 ...
 - AdapterView及其子类之三:基于ListView及ArrayAdapter实现列表
			
见归档项目ListViewDemo.zip. 基本步骤如下: 1.创建主布局文件,里面包含一个ListView元素. <RelativeLayout xmlns:android="ht ...