上次介绍了用WebClient的方式提交POST请求,这次,我继续来介绍用其它一种方式

HttpWebRequest以及HttpWebResponse

自认为与上次介绍的WebClient最大的不同之处在于HttpWebRequest更灵活,也更强大,比如,HttpWebRequest支持Cookie,而WebClient就不支持,因此,如果要登录某个网站才能进行某些操作的时候,HttpWebResponse就派上用场了。

补充:

WebClient是可以操作Cookie的,因为Cookie本质上就是个字符串,只要服务器返回的头是“SetCooie:xxx”,所以,按照返回的格式做下处理(不能原样返回,具体可以抓包分析下格式),存起来,然后在HTTP请求头上加上“Cookie:xxx”即可

首先要提下Referer还有Cookie

Referer:就是一般在浏览器中发送Http请求时带的头信息,被广泛用来统计点击信息,即从那个点击而来,所以有些网站也会用这个性质来防盗链,很多时候如果什么图片仅限内部交流之类的,就是用了这个原理。

Cookie:某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密),通常大家登录的时候就要用到它,登录后,网站会储存一个Cookie的东西在本地计算机上,然后每次访问网站时,便会把这个网站的Cookie也一并发送过去,服务器就凭借这个来确认你的身份。它是个重要信息,有些黑客也会通过盗取Cookie的方式来侵入你的账户。

好了,现在开始具体说明:

  1. HttpWebRequest request = (HttpWebRequest)WebRequest.Create("POST请求的地址");
  2. request.CookieContainer = new CookieContainer();
  3. CookieContainer cookie = request.CookieContainer;//如果用不到Cookie,删去即可
  4. //以下是发送的http头,随便加,其中referer挺重要的,有些网站会根据这个来反盗链
  5. request.Referer = “http://localhost/index.php”;
  6. request.Accept = "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  7. request.Headers["Accept-Language"] = "zh-CN,zh;q=0.";
  8. request.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3";
  9. request.UserAgent = "User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1";
  10. request.KeepAlive = true;
  11. //上面的http头看情况而定,但是下面俩必须加
  12. request.ContentType = "application/x-www-form-urlencoded";
  13. request.Method = "POST";
  14. Encoding encoding = Encoding.UTF8;//根据网站的编码自定义
  15. byte[] postData = encoding.GetBytes(postDataStr);//postDataStr即为发送的数据,格式还是和上次说的一样
  16. request.ContentLength = postData.Length;
  17. Stream requestStream = request.GetRequestStream();
  18. requestStream.Write(postData, 0, postData.Length);
  19. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  20. Stream responseStream = response.GetResponseStream();
  21. //如果http头中接受gzip的话,这里就要判断是否为有压缩,有的话,直接解压缩即可
  22. if (response.Headers["Content-Encoding"] != null && response.Headers["Content-Encoding"].ToLower().Contains("gzip"))
  23. {
  24. responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
  25. }
  26. StreamReader streamReader = new StreamReader(responseStream, encoding);
  27. string retString = streamReader.ReadToEnd();
  28. streamReader.Close();
  29. responseStream.Close();
  30. return retString;

当然,请注意,我只是把知识与大家分享,不是让大家去做损害他人网站的事。

反过来,作为Web开发人员,也要明白,不能相信客户端发送来的数据总是合法的,也不能以为他人只能通过浏览器来访问网站,上面就是个例子

而作为防范,验证码之类的可以防范大部分人了~只是,也别以为有了验证码就能防住所有人了,欲知后事如何,请听下回分解~

C#模拟POST提交表单(二)--HttpWebRequest以及HttpWebResponse的更多相关文章

  1. C#模拟POST提交表单(一)--WebClient

    C#的提交表单方式主要有两种WebClient与HttpWebRequest,这里先介绍一种 WebClient,转送门:http://msdn.microsoft.com/zh-cn/library ...

  2. js模拟支付宝提交表单

    弄过支付宝的程序猿可能都知道,里面有非常多地方都用到了自提交表单的方式,支付宝的接口通过请求API的形式取得server返回的表单字符串,使用out.print("表单字符串")在 ...

  3. Java模拟post提交表单数据

    package test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOExcep ...

  4. 【HTTP】模拟form提交表单(转)

    第一种:WebClient string postString = "arg1=a&arg2=b";//这里即为传递的参数,可以用工具抓包分析,也可以自己分析,主要是for ...

  5. php模拟post 提交表单

    <?php header('Content-type: text/html;charset=UTF-8'); $action=$_REQUEST['action']; //获取验证码 if($a ...

  6. js模拟post提交表单

    function post(URL, PARAMS) {            var temp = document.createElement("form");         ...

  7. php 提交表单

    滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园   首页   博问   闪存     联系   订阅  管理 随笔-58  评论-2017  文章-5  trackba ...

  8. 搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

    调试Django框架写的服务时,需要模拟客户端发送POST请求,然而浏览器只能模拟简单的GET请求(将参数写在url内),网上搜索得到了HttpRequester这一firefox插件,完美的实现了模 ...

  9. .Net模拟提交表单

    2016-09-0210:49:20 以中邮速递API为服务接口,由于提交方式为表单提交,我要获取返回值来处理其他业务,所以一开始尝试采用Js后台获取返回值,但是涉及到跨域请求限制问题,那边服务端接口 ...

随机推荐

  1. java多线程 ReentrantLock

    本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...

  2. 【HDOJ】2988 Dark roads

    最小生成树. /* */ #include <iostream> #include <string> #include <map> #include <que ...

  3. 在Windows Server 2012 上安装Exchange 2013 服务器

    前文:http://www.cnblogs.com/Liangw/archive/2011/09/19/2559944.html 安装准备: 1.加入一个存在的域(?如何建立一个域) 2.登录Wind ...

  4. Poj 2478-Farey Sequence 欧拉函数,素数,线性筛

    Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14291   Accepted: 5647 D ...

  5. asp json

    <script language="JScript" runat="Server">function toObject(json) {    eva ...

  6. Circle - SGU 130(递推)

    题目大意:一个圆上有2K个点,用K个线把他们连接起来,求出这些线最少可以把这个圆分成P部分,有N种分割方法.输出N和P. 分析:分割线一定是相互不相交的线,所以可以把这写分成两部分,f[i] += f ...

  7. BufferedInputStream,FileInputStream,FileChannel实现文件拷贝

    从上篇文章中知道BufferedInputStream是自带缓冲区的输入流,可以大大减少IO次数,提供效率.下面的例子中实现了用BufferedInputStream与FileInputStream实 ...

  8. OMCS的语音视频带宽占用

    OMCS的语音.视频.电子白板.远程桌面等功能对网络带宽的要求分别如何了? 我们先假设一种常见的场景:假设N个在线用户同时进行1对1的多媒体沟通(即分为N/2组),在不考虑P2P通道的情况下,带宽的大 ...

  9. [置顶] 获取激活码,激活myeclipse

    myeclipse10.0 正式版下载地址: http://downloads.myeclipseide.com/downloads/products/eworkbench/indigo/instal ...

  10. JAVA 内存泄露的理解

    1 什么是内存泄露? 内存泄露是指没用的对象持续占有内存空间,造成内存空间浪费.所以说JAVA是有内存泄露的. 2 内存泄露的原因是什么? 较长生命周期对象持有短生命周期对象的引用,导致短生命周期对象 ...