这篇文章是在博客园正式的第一篇文章。


×

不出意外 以后将在web的方向发展,前段时间把老早以前做过的webqq机器人重做了一遍,算是对winform的告别吧,巩固了C#方面的知识。

本篇主要介绍了我对模拟http请求方式的介绍和理解。(博客的样式是自己写的,有木有感觉好看呢(•‾̑⌣‾̑•)✧˖°)

首先 看一个GET请求

public string GetHtml(string url, string Referer, Encoding encode, bool SaveCookie)
{
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.Method = "GET";
req.CookieContainer = this.CookieContainer;
req.Proxy = null;
if (!string.IsNullOrEmpty(Referer))
req.Referer = Referer;
using (HttpWebResponse hwr = req.GetResponse() as HttpWebResponse)
{
if (SaveCookie)
{
this.CookieCollection = hwr.Cookies;
this.CookieContainer.GetCookies(req.RequestUri);
}
using (StreamReader SR = new StreamReader(hwr.GetResponseStream(), encode))
{
return SR.ReadToEnd();
}
}
}

然后 再看POST

 public string PostHtml(string url, string Referer, string data, Encoding encode, bool SaveCookie)
{
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.CookieContainer = this.CookieContainer;
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
req.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:30.0) Gecko/20100101 Firefox/30.0";
req.Proxy = null;
req.ProtocolVersion = HttpVersion.Version10;
if (!string.IsNullOrEmpty(Referer))
req.Referer = Referer;
byte[] mybyte = Encoding.Default.GetBytes(data);
req.ContentLength = mybyte.Length;
using (Stream stream = req.GetRequestStream())
{
stream.Write(mybyte, 0, mybyte.Length);
}
using (HttpWebResponse hwr = req.GetResponse() as HttpWebResponse)
{
if (SaveCookie)
{
this.CookieCollection = hwr.Cookies;
this.CookieContainer.GetCookies(req.RequestUri);
}
using (StreamReader SR = new StreamReader(hwr.GetResponseStream(), encode))
{
return SR.ReadToEnd();
}
}
}

小结

1.这是我封装的一个httphelp类中的一部分,get貌似不需要那些像什么UserAgent,ContentType之类的东西

2.POST请求中一般要设置ContentType和UserAgent

3.默认请求是GET

如何 保持Cookie

每次请求之后保存CookieContainer即可,赋给下一次请求的httpwebrequest

区别 HttpWebRequest.CookieContainer和HttpWebResponse.CookieCollection

此处说的是进行一次http请求获得响应之后

CookieContainer是当前域的所有Cookie

CookieCollection是该次请求相关的所有Cookie

Referer 是什么

即本次请求的来源,从哪个页面进行http请求的

这里常被服务器用来检测请求是否合法

proxy?

请求的代理,对此我了解不多,忘有人能告之

在请求之前设置proxy=null,可以让请求跳过检查代理,http请求速度立刻上升一个档次!尤其是以前蹭wifi的时候我深有体会


这里是我封装的一个http请求辅助类,大家有兴趣可以参考一下

public class HttpHelp
{
public CookieContainer CookieContainer { get; set; } public CookieCollection CookieCollection { get; set; } public HttpHelp()
{
this.CookieCollection = new CookieCollection();
this.CookieContainer = new CookieContainer();
} public static string GetHtml(string url, string Referer, Encoding encode)
{
return new HttpHelp().GetHtml(url, Referer, encode, false);
} public static string PostHtml(string url, string Referer, string data, Encoding encode)
{
return new HttpHelp().PostHtml(url, Referer, data, encode, false);
} public string GetHtml(string url, string Referer, Encoding encode, bool SaveCookie)
{
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.Method = "GET";
req.CookieContainer = this.CookieContainer;
req.Proxy = null;
if (!string.IsNullOrEmpty(Referer))
req.Referer = Referer;
using (HttpWebResponse hwr = req.GetResponse() as HttpWebResponse)
{
if (SaveCookie)
{
this.CookieCollection = hwr.Cookies;
this.CookieContainer.GetCookies(req.RequestUri);
}
using (StreamReader SR = new StreamReader(hwr.GetResponseStream(), encode))
{
return SR.ReadToEnd();
}
}
} public string PostHtml(string url, string Referer, string data, Encoding encode, bool SaveCookie)
{
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.CookieContainer = this.CookieContainer;
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
req.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:30.0) Gecko/20100101 Firefox/30.0";
req.Proxy = null;
req.ProtocolVersion = HttpVersion.Version10;
if (!string.IsNullOrEmpty(Referer))
req.Referer = Referer;
byte[] mybyte = Encoding.Default.GetBytes(data);
req.ContentLength = mybyte.Length;
using (Stream stream = req.GetRequestStream())
{
stream.Write(mybyte, 0, mybyte.Length);
}
using (HttpWebResponse hwr = req.GetResponse() as HttpWebResponse)
{
if (SaveCookie)
{
this.CookieCollection = hwr.Cookies;
this.CookieContainer.GetCookies(req.RequestUri);
}
using (StreamReader SR = new StreamReader(hwr.GetResponseStream(), encode))
{
return SR.ReadToEnd();
}
}
} ///
/// 上传文件
///
///上传地址
///文件路径
///原网页file控件name
///请求流中的contentType
///返回的encoding
///post参数字典
///
public static string PostFile(string url, string filepath, string paramName, string contentType, Encoding encode, Dictionary<string, string> dict)
{
HttpWebRequest hrq = WebRequest.Create(url) as HttpWebRequest;
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
byte[] boundarybytes = System.Text.Encoding.Default.GetBytes("\r\n--" + boundary + "\r\n");
hrq.ContentType = "multipart/form-data; boundary=" + boundary;
hrq.Method = "POST"; using (Stream stream = hrq.GetRequestStream()) //请求流
{
//写入post参数
string formdataTemplete = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
if (dict != null && dict.Count > 0)
{
foreach (KeyValuePair<string, string> pair in dict)
{
stream.Write(boundarybytes, 0, boundarybytes.Length);
string formitem = string.Format(formdataTemplete, pair.Key, pair.Value);
byte[] formitemBytes = Encoding.Default.GetBytes(formitem);
stream.Write(formitemBytes, 0, formitemBytes.Length);
}
}
stream.Write(boundarybytes, 0, boundarybytes.Length); //写入头信息
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
string header = string.Format(headerTemplate, paramName, Path.GetFileName(filepath), contentType);
byte[] headerBytes = Encoding.UTF8.GetBytes(header);
stream.Write(headerBytes, 0, headerBytes.Length); //写入文件
byte[] fileBytes = File.ReadAllBytes(filepath);
stream.Write(fileBytes, 0, fileBytes.Length); //写入尾部
byte[] footerBytes = Encoding.Default.GetBytes("\r\n--" + boundary + "--\r\n");
stream.Write(footerBytes, 0, footerBytes.Length); using (HttpWebResponse hrp = hrq.GetResponse() as HttpWebResponse)//响应流
{
using (StreamReader SR = new StreamReader(hrp.GetResponseStream(), encode))
{
return SR.ReadToEnd();
}
}
} } }

登陆百度示例:点击下载

登陆百度的一个demo,我在13年写的 =。= ,现在登陆加密了,不过以前的这种方式仍然可以用,呵呵

吐槽一下,从来没写过博客,无论是新浪,QQ,还是其它。今天才发现这排版太累。

之后打算写一下,模拟webqq请求来实现QQ机器人。尽量写成一个系列吧...么么哒(*゚∀゚*)

.

使用HttpWebrequest对网站进行模拟操作(附登陆百度demo)的更多相关文章

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

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

  2. jquery模拟操作——trigger()函数

    在页面中很多效果需要触发才能实现,比如click后的弹窗.但有时我们无法点击或是跳过用户触发,就像网页中那些可恶的广告弹窗 trigger函数可以实现模拟操作.譬如常用的点击动作,我们可以这样, $( ...

  3. 在PC上测试移动端网站和模拟手机浏览器的5大方法

    在PC上测试移动端网站和模拟手机浏览器的5大方法 来源:互联网 作者:佚名 时间:03-19 10:14:54 [大 中 小]                最近公司要开发网站的移动版,让我准备准备知 ...

  4. jQuery中的模拟操作

    jQuery中的模拟操作主要是通过trigger来触发,相当于页面加载完成后不需要用户点击按钮,就可以自动触发页面中的相关事件. trigger(type,[data])可以用来模拟触发自定义事件的触 ...

  5. Opera浏览器测试移动端网站和模拟手机浏览器的方法

    链接地址:http://www.neirong.org/post-256.html?utm_source=tuicool Chrome浏览器请看:Chrome浏览器测试移动端网站和模拟手机浏览器的方法 ...

  6. adb模拟操作之event

    首语: 我们都知道,adb可以对模拟器和root过的真机进行很多操作,例如:模拟点击,输入,截图,手机和PC,数据互传等.这篇要说的就是adb操作模拟器或者真机的输入输出. 0x01 问题 使用adb ...

  7. 剑指Offer——Java实现栈和队列的互模拟操作

    剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列   题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型.   思路:其实就是把队列正常入 ...

  8. jQuery 模拟操作

    1.常用模拟 有时,需要通过模拟用户操作,来达到单击的效果.例如在用户进入页面后,就触发 click 事件,而不需要用户去主动单击.在 jQuery 中,可以使用 trigger() 方法完成模拟操作 ...

  9. 【转】详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)

    转自:http://www.crifan.com/files/doc/docbook/web_scrape_emulate_login/release/html/web_scrape_emulate_ ...

随机推荐

  1. COGS738 [网络流24题] 数字梯形(最小费用最大流)

    题目这么说: 给定一个由n 行数字组成的数字梯形如下图所示.梯形的第一行有m 个数字.从梯形的顶部的m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径.规则1:从梯形的 ...

  2. ACM: SGU 101 Domino- 欧拉回路-并查集

    sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Desc ...

  3. NOIp 2014 #2 联合权值 Label:图论 !!!未AC

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  4. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

  5. [Leetcode] Subsets II

    Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: ...

  6. 3分钟4个步骤超级简单入门配置lamp

    按照我下面的推荐博客进行3步安装,最后进行一步测试就完成了.环境:我的环境是在windows10中安装的VMware中安装的Ubuntu虚拟机,Windows8,7应该是一样的测试:分别用localh ...

  7. SDL实战,小游戏

    http://www.cppblog.com/sandy/archive/2005/12/28/2219.html sdl1教学 http://kelvmiao.info/sdl-tutorial-c ...

  8. ArrayList类的实现

    package other; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import ...

  9. poj 2325 Persistent Numbers

    简单的贪心和高精度运算,主要还是要读懂题. #include"iostream" #include"stdio.h" #include"string& ...

  10. linux笔记四-------用户和组的管理

    1.linux多用户.多任务操作系统 cat /etc/passwd   //查看当前系统用户信息 cat /etc/group    //查看当前系统组别信息 2.rbac:基于角色进行权限分配 用 ...