HttpOperater-模拟HTTP操作类
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions; namespace Whir.Software.DocumentDownLoader.Library
{
/// <summary>
/// 模拟HTTP操作
/// </summary>
public class HttpOperater
{
/// <summary>
/// 发起Http请求
/// </summary>
/// <param name="httpRequestType">请求方式</param>
/// <param name="url">请求地址</param>
/// <param name="cookieInput">请求时传入的cookie</param>
/// <param name="cookieOutput">服务器返回的cookie</param>
/// <param name="postData">发送数据</param>
/// <returns></returns>
public static string DoRequest(HttpRequestType httpRequestType, string url, string cookieInput, ref string cookieOutput, string postData)
{
string response;
try
{
const string windowsUserName = "";
const string windowsPwd = "";
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";
const string accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
const string acceptLanguage = "zh-CN,zh;q=0.8";
const string acceptEncoding = "gzip,deflate,sdch";
CookieContainer cookieContainer = GetCookie(url, cookieInput); var newUri = new Uri(url);
var request = (HttpWebRequest)WebRequest.Create(newUri);
request.PreAuthenticate = true;
if (windowsUserName.Length > 0 & windowsPwd.Length > 0)
{
request.Credentials = new NetworkCredential(windowsUserName.Trim(), windowsPwd.Trim());
}
request.Timeout = 20000;
request.CookieContainer = cookieContainer;
request.UserAgent = userAgent;
request.Accept = accept;
request.Headers["Accept-Language"] = acceptLanguage;
request.Headers["Accept-Charset"] = acceptEncoding;
request.Headers["Accept-Encoding"] = acceptEncoding;
request.Referer = newUri.AbsoluteUri;
request.Method = httpRequestType == HttpRequestType.GET ? "GET" : "POST";
if (request.Method == "POST")
{
request.ContentType = "application/x-www-form-urlencoded";
byte[] bytes = Encoding.UTF8.GetBytes(postData);
request.ContentLength = bytes.Length;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(bytes, 0, bytes.Length);
}
}
using (var wr = (HttpWebResponse)request.GetResponse())
{
response = new StreamReader(wr.GetResponseStream(), Encoding.GetEncoding("utf-8")).ReadToEnd();
}
CookieCollection cookies = cookieContainer.GetCookies(newUri);
cookieOutput = CookieTostr(cookies);
}
catch (NotSupportedException exception)
{
response = exception.Message;
}
catch (InvalidOperationException exception)
{
response = exception.Message;
}
catch (IOException exception)
{
response = exception.Message;
}
catch (Exception exception)
{
response = exception.Message;
}
return response;
}
/// <summary>
/// 设置cookie域
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="cookieInput">cookie</param>
/// <returns></returns>
private static CookieContainer GetCookie(string url, string cookieInput)
{
var cookieContainer = new CookieContainer();
var cookies = new CookieCollection();
string[] cookiesArr = cookieInput.Split(';');
foreach (string s in cookiesArr)
{
string[] keyValuePair = s.Split('=');
if (keyValuePair.Length > 1)
{
var cookie = new Cookie
{
Name = keyValuePair[0].Trim(),
Value = keyValuePair[1].Trim(),
Domain = GetDomain(url).Trim()//设置cookie域
};
cookies.Add(cookie);
}
}
cookieContainer.Add(cookies);
return cookieContainer;
}
/// <summary>
/// 通过Url取得域
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private static string GetDomain(string url)
{
var regex = new Regex("(?i)http[s]*://(?<domain>[\\w|.]*)",
RegexOptions.CultureInvariant | RegexOptions.Compiled);
return regex.Match(url).Groups["domain"].Value;
} /// <summary>
/// 将cookie转为字符串
/// </summary>
/// <param name="cookies"></param>
/// <returns></returns>
private static string CookieTostr(CookieCollection cookies)
{
return cookies.Cast<Cookie>()
.Aggregate(string.Empty, (current, c) => current + (c.Name + "=" + c.Value + ";"));
}
} /// <summary>
/// HTTP请求方式
/// </summary>
public enum HttpRequestType
{
/// <summary>
/// GET
/// </summary>
GET = 1, /// <summary>
/// POST
/// </summary>
POST = 2
}
}
注:使用时,ref string cookiesOutput参数是服务器返回的Cookie,需保存用于下次请求。
HttpOperater-模拟HTTP操作类的更多相关文章
- Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)
上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...
- C# 字符串操作类
using System; using System.Collections.Generic; using System.Text; using System.Collections; using S ...
- PHP FTP操作类( 上传、拷贝、移动、删除文件/创建目录 )
/** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) * 时间:2006/5/9 * 作者:欣然随风 * QQ:276624915 */ class class_ftp { publi ...
- (实用篇)PHP ftp上传文件操作类
<?php /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ftp { public $off; // 返回操作状态(成功/失败) publi ...
- C# 文件操作类大全
C# 文件操作类大全 时间:2015-01-31 16:04:20 阅读:1724 评论:0 收藏:0 [点我收藏+] 标签: 1.创建文件夹 //usin ...
- firefox下载文件弹出框之终极解决方案-vbs模拟键盘操作
由于近期一直被firefox的保存文件弹出框困扰,摸索尝试过几种方法,已有的方法可以跑通但是对对效果不太满意,因此一直在寻找合适的解决办法. 最近发现了也可以通过VBS来处理弹出框,速度也不错,其原理 ...
- PHP模拟链表操作
PHP模拟链表操作 一.总结 1.类成员用的是-> 2.对象节点相连的话,因为是对象,所以不用取地址符号 3.数组传递参数的时候传引用的方法 ,& 二.PHP模拟链表操作 代码一: /* ...
- php的FTP操作类
class_ftp.php <?php /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ftp { public $off; // 返回操作状 ...
- python sqlite3操作类扩展,包含数据库分页
一.原因 最近在使用python3和sqlite3编辑一些小程序,由于要使用数据库,就离不开增.删.改.查,sqlite3的操作同java里的jdbc很像,于是就想找现成的操作类,找来找去,发现一个 ...
随机推荐
- 使用VMware创建Linux虚拟机
准备工作: 下载安装:VMware8.0 (这版本相对稳定,体积小) 下载:rhel-server-5.8-i386-dvd.iso Ready? Go! 1.新建空的虚拟机,相当于多了一台电脑 除了 ...
- Hibernate:有了 save,为什么还需要 persist?
背景 万物皆自然,每个 API 的设计,无论是否正确,都有其意图.因此,在学习某些框架的时候,我们需要经常思考:这个 API 的设计意图是啥? 本文来探讨一下 Session 中 persist 的设 ...
- viewport Meta Tag
网页手机wap2.0网页的head里加入下面这条元标签,在iPhone的浏览器中页面将以原始大小显示,并不允许缩放. <meta name="viewport" conten ...
- 多种非接触卡 ATQA 字节说明
原文地址 13.56 MHz RFID Software An Open Source implementation of an NFC stack, and various related ut ...
- windows服务器提权前请先执行systeminfo命令
pr.巴西烤肉 对应补丁 好多朋友见到Windows服务器就祭出pr.巴西烤肉一气搞,忙完免杀又忙找可写目录,最后发现服务器打上了对应的补丁.笔者在提权前都会执行systeminfo命令,查看对应补丁 ...
- MonoSingleton——Unity中的单例模式
Unity中有很多特别的类需要以单例模式呈现,比如全局的UI管理类,各种缓存池,以及新手导航类等等.而Unity中,因为所有继承自Monobehaviour的脚本在实现的时候都是单线程的,所以像网上流 ...
- .NET-使用NPOI组件将数据导出Excel-通用方法
一.Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题:导出问题: 如果是asp.net,你 ...
- C# 网络斗地主源码开源
C# 网络斗地主源码开源多线程 讨论交流及 下载地址 可以发送聊天消息
- 超棒的在线Bootstrap主题编辑工具 - lollytin
lollytin 是一款帮助制作Bootstrap3主题的在线工具,虽然现在仍旧是Beta版本,但是已经非常不错了. 主要功能: 通过拖拽来生成主题 支持拖拽页头,页脚,内容,幻灯,地图,表单,画廊, ...
- 解决iOS Xcode 模拟器键盘不弹出
1. 选中模拟器,在屏幕上方的菜单中找到Hardware->Keyboard 2. 直接快捷键shift+command+k