1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7.  
  8. namespace Whir.Software.DocumentDownLoader.Library
  9. {
  10. /// <summary>
  11. /// 模拟HTTP操作
  12. /// </summary>
  13. public class HttpOperater
  14. {
  15. /// <summary>
  16. /// 发起Http请求
  17. /// </summary>
  18. /// <param name="httpRequestType">请求方式</param>
  19. /// <param name="url">请求地址</param>
  20. /// <param name="cookieInput">请求时传入的cookie</param>
  21. /// <param name="cookieOutput">服务器返回的cookie</param>
  22. /// <param name="postData">发送数据</param>
  23. /// <returns></returns>
  24. public static string DoRequest(HttpRequestType httpRequestType, string url, string cookieInput, ref string cookieOutput, string postData)
  25. {
  26. string response;
  27. try
  28. {
  29. const string windowsUserName = "";
  30. const string windowsPwd = "";
  31. const string userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36";
  32. const string accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  33. const string acceptLanguage = "zh-CN,zh;q=0.8";
  34. const string acceptEncoding = "gzip,deflate,sdch";
  35. CookieContainer cookieContainer = GetCookie(url, cookieInput);
  36.  
  37. var newUri = new Uri(url);
  38. var request = (HttpWebRequest)WebRequest.Create(newUri);
  39. request.PreAuthenticate = true;
  40. if (windowsUserName.Length > 0 & windowsPwd.Length > 0)
  41. {
  42. request.Credentials = new NetworkCredential(windowsUserName.Trim(), windowsPwd.Trim());
  43. }
  44. request.Timeout = 20000;
  45. request.CookieContainer = cookieContainer;
  46. request.UserAgent = userAgent;
  47. request.Accept = accept;
  48. request.Headers["Accept-Language"] = acceptLanguage;
  49. request.Headers["Accept-Charset"] = acceptEncoding;
  50. request.Headers["Accept-Encoding"] = acceptEncoding;
  51. request.Referer = newUri.AbsoluteUri;
  52. request.Method = httpRequestType == HttpRequestType.GET ? "GET" : "POST";
  53. if (request.Method == "POST")
  54. {
  55. request.ContentType = "application/x-www-form-urlencoded";
  56. byte[] bytes = Encoding.UTF8.GetBytes(postData);
  57. request.ContentLength = bytes.Length;
  58. using (Stream requestStream = request.GetRequestStream())
  59. {
  60. requestStream.Write(bytes, 0, bytes.Length);
  61. }
  62. }
  63. using (var wr = (HttpWebResponse)request.GetResponse())
  64. {
  65. response = new StreamReader(wr.GetResponseStream(), Encoding.GetEncoding("utf-8")).ReadToEnd();
  66. }
  67. CookieCollection cookies = cookieContainer.GetCookies(newUri);
  68. cookieOutput = CookieTostr(cookies);
  69. }
  70. catch (NotSupportedException exception)
  71. {
  72. response = exception.Message;
  73. }
  74. catch (InvalidOperationException exception)
  75. {
  76. response = exception.Message;
  77. }
  78. catch (IOException exception)
  79. {
  80. response = exception.Message;
  81. }
  82. catch (Exception exception)
  83. {
  84. response = exception.Message;
  85. }
  86. return response;
  87. }
  88. /// <summary>
  89. /// 设置cookie域
  90. /// </summary>
  91. /// <param name="url">请求地址</param>
  92. /// <param name="cookieInput">cookie</param>
  93. /// <returns></returns>
  94. private static CookieContainer GetCookie(string url, string cookieInput)
  95. {
  96. var cookieContainer = new CookieContainer();
  97. var cookies = new CookieCollection();
  98. string[] cookiesArr = cookieInput.Split(';');
  99. foreach (string s in cookiesArr)
  100. {
  101. string[] keyValuePair = s.Split('=');
  102. if (keyValuePair.Length > 1)
  103. {
  104. var cookie = new Cookie
  105. {
  106. Name = keyValuePair[0].Trim(),
  107. Value = keyValuePair[1].Trim(),
  108. Domain = GetDomain(url).Trim()//设置cookie域
  109. };
  110. cookies.Add(cookie);
  111. }
  112. }
  113. cookieContainer.Add(cookies);
  114. return cookieContainer;
  115. }
  116. /// <summary>
  117. /// 通过Url取得域
  118. /// </summary>
  119. /// <param name="url"></param>
  120. /// <returns></returns>
  121. private static string GetDomain(string url)
  122. {
  123. var regex = new Regex("(?i)http[s]*://(?<domain>[\\w|.]*)",
  124. RegexOptions.CultureInvariant | RegexOptions.Compiled);
  125. return regex.Match(url).Groups["domain"].Value;
  126. }
  127.  
  128. /// <summary>
  129. /// 将cookie转为字符串
  130. /// </summary>
  131. /// <param name="cookies"></param>
  132. /// <returns></returns>
  133. private static string CookieTostr(CookieCollection cookies)
  134. {
  135. return cookies.Cast<Cookie>()
  136. .Aggregate(string.Empty, (current, c) => current + (c.Name + "=" + c.Value + ";"));
  137. }
  138. }
  139.  
  140. /// <summary>
  141. /// HTTP请求方式
  142. /// </summary>
  143. public enum HttpRequestType
  144. {
  145. /// <summary>
  146. /// GET
  147. /// </summary>
  148. GET = 1,
  149.  
  150. /// <summary>
  151. /// POST
  152. /// </summary>
  153. POST = 2
  154. }
  155. }

注:使用时,ref string cookiesOutput参数是服务器返回的Cookie,需保存用于下次请求。

HttpOperater-模拟HTTP操作类的更多相关文章

  1. Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)

    上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...

  2. C# 字符串操作类

    using System; using System.Collections.Generic; using System.Text; using System.Collections; using S ...

  3. PHP FTP操作类( 上传、拷贝、移动、删除文件/创建目录 )

    /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) * 时间:2006/5/9 * 作者:欣然随风 * QQ:276624915 */ class class_ftp { publi ...

  4. (实用篇)PHP ftp上传文件操作类

    <?php /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ftp { public $off; // 返回操作状态(成功/失败) publi ...

  5. C# 文件操作类大全

      C# 文件操作类大全 时间:2015-01-31 16:04:20      阅读:1724      评论:0      收藏:0      [点我收藏+] 标签: 1.创建文件夹 //usin ...

  6. firefox下载文件弹出框之终极解决方案-vbs模拟键盘操作

    由于近期一直被firefox的保存文件弹出框困扰,摸索尝试过几种方法,已有的方法可以跑通但是对对效果不太满意,因此一直在寻找合适的解决办法. 最近发现了也可以通过VBS来处理弹出框,速度也不错,其原理 ...

  7. PHP模拟链表操作

    PHP模拟链表操作 一.总结 1.类成员用的是-> 2.对象节点相连的话,因为是对象,所以不用取地址符号 3.数组传递参数的时候传引用的方法 ,& 二.PHP模拟链表操作 代码一: /* ...

  8. php的FTP操作类

    class_ftp.php <?php /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ftp { public $off; // 返回操作状 ...

  9. python sqlite3操作类扩展,包含数据库分页

     一.原因 最近在使用python3和sqlite3编辑一些小程序,由于要使用数据库,就离不开增.删.改.查,sqlite3的操作同java里的jdbc很像,于是就想找现成的操作类,找来找去,发现一个 ...

随机推荐

  1. linux中的dup()系统调用

    参考1:http://www.blogjava.net/lihao336/archive/2011/12/13/366231.html 在linux纷繁复杂的内核代码中,sys_dup()的代码也许称 ...

  2. 使用WCF测试客户端 z

    http://blog.csdn.net/u013036274/article/details/50570989 [是什么] WCF测试客户端(WCF Test Client)是一个用来测试WCF服务 ...

  3. .NET:字符集和编码学习总结

    背景 一直没有深入的学习字符集和编码的知识(现在也没有深入),今天查阅了一些资料,弄明白了一些事情,本文就简单记录一下. 字符集和编码 字符集是指一些符号组成的集合,编码是对指定字符集如何表示为字节的 ...

  4. appium+python自动化60-windows上同时启动多个appium服务,让多个android机器并行运行

    前言 做android自动化的时候,启动一个appium服务,只能匹配一个手机去自动化执行.有时候想同一套代码,可以在不同的手机上执行,测下app在不同手机上兼容性. 这就需要启动多个appium服务 ...

  5. (重置adb.exe)android关于The connection to adb is down, and a severe error has occured.这个问题的解决办法

    转自:http://www.sjsjw.com/kf_mobile/article/3_24710_14072.asp 这里补充一个更简单的方法(和下面的方法一样的效果): 有时在打开模拟器的时候会出 ...

  6. Python的__getattribute__ vs __getattr__的妙用

    这里的属性即包括属性变量,也包括属性方法.即类的变量和方法. 当访问某个实例属性时, getattribute会被无条件调用,如未实现自己的getattr方法,会抛出AttributeError提示找 ...

  7. Python爬虫(3)豆瓣登录

    前面(1)(2)的内容已经足够爬虫如链家网之类的不需要登录可以直接获取数据的网站. 而要爬取社交网站比较鲜明的特点就是需要登录,否则很多东西都无法获取.经过测试发现,微博,知乎都不是很好登录,知乎有时 ...

  8. 学生表 课程表 成绩表 教师表 50个常用sql语句

    原文:http://www.cnblogs.com/zengxiangzhan/archive/2009/09/23/1572276.html Student(S#,Sname,Sage,Ssex) ...

  9. Microsoft Bot Builder Overview

    微软机器人构建器概述 微软机器人Builder是一个强大的框架构建机器人可以处理自由交互和更多的引导,这种可能性是显式地显示给用户. 它很容易使用和利用c#写机器人提供一个自然的方式. 高级功能: 强 ...

  10. [Functional Programming] Working with two functors(Applicative Functors)-- Part2 --liftAN

    Let's examine a pointfree way to write these applicative calls. Since we know map is equal to of/ap, ...