WebRequestHelper
老是浪费时间写这个类,干脆记录在博客里:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Security;
using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks; namespace XiaoDao.Core
{
public class WebRequestHelper
{
private const string userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"; #region HttpPost
public static string HttpPost(WebRequestOption options)
{
if (options.SecurityProtocol != SecurityProtocolType.SystemDefault)
{
ServicePointManager.SecurityProtocol = options.SecurityProtocol;
}
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(options.Url);
myRequest.Method = "POST";
if (options.CC != null)
{
myRequest.CookieContainer = options.CC;
}
if (options.Headers.Count > 0)
{
foreach (var item in options.Headers)
{
myRequest.Headers.Add(item.Key, item.Value);
}
}
if (options.ContentType != null)
{
myRequest.ContentType = options.ContentType;
}
else
{
//myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentType = "application/json";
}
myRequest.UserAgent = userAgent; byte[] payload = null;
string formData = GetFormData(options.Paras);
if (!string.IsNullOrEmpty(formData))
{
payload = Encoding.UTF8.GetBytes(formData);
myRequest.ContentLength = payload.Length;
}
if (options.MyProxy != null)
{
myRequest.Proxy = options.MyProxy;
}
using (Stream mySream = myRequest.GetRequestStream())
{
if (payload != null && payload.Length > 0)
{
mySream.Write(payload, 0, payload.Length);
}
} try
{
using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse())
{
using (StreamReader myReader = new StreamReader(myResponse.GetResponseStream(), options.MyEncoding))
{
string responseText = myReader.ReadToEnd();
return responseText;
}
}
}
catch (Exception ex)
{
options.MyException = ex;
return null;
}
} public static async Task<string> HttpPostAsync(WebRequestOption options)
{
if (options.SecurityProtocol != SecurityProtocolType.SystemDefault)
{
ServicePointManager.SecurityProtocol = options.SecurityProtocol;
}
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(options.Url);
myRequest.Method = "POST";
if (options.CC != null)
{
myRequest.CookieContainer = options.CC;
}
if (options.Headers.Count > 0)
{
foreach (var item in options.Headers)
{
myRequest.Headers.Add(item.Key, item.Value);
}
}
if (options.ContentType != null)
{
myRequest.ContentType = options.ContentType;
}
else
{
myRequest.ContentType = "application/x-www-form-urlencoded";
//myRequest.ContentType = "application/json";
}
myRequest.UserAgent = userAgent; byte[] payload = null;
string formData = GetFormData(options.Paras);
if (!string.IsNullOrEmpty(formData))
{
payload = Encoding.UTF8.GetBytes(formData);
myRequest.ContentLength = payload.Length;
}
if (options.MyProxy != null)
{
myRequest.Proxy = options.MyProxy;
}
using (Stream mySream = myRequest.GetRequestStream())
{
if (payload != null && payload.Length > 0)
{
mySream.Write(payload, 0, payload.Length);
}
} try
{
using (HttpWebResponse myResponse = (HttpWebResponse)await myRequest.GetResponseAsync())
{
using (StreamReader myReader = new StreamReader(myResponse.GetResponseStream(), options.MyEncoding))
{
string responseText = myReader.ReadToEnd();
return responseText;
}
}
}
catch (Exception ex)
{
options.MyException = ex;
return null;
}
} public static async Task<string> HttpPostJsonAsync(WebRequestOption options)
{
if (options.SecurityProtocol != SecurityProtocolType.SystemDefault)
{
ServicePointManager.SecurityProtocol = options.SecurityProtocol;
}
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(options.Url);
myRequest.Method = "POST";
if (options.CC != null)
{
myRequest.CookieContainer = options.CC;
}
if (options.Headers.Count > 0)
{
foreach (var item in options.Headers)
{
myRequest.Headers.Add(item.Key, item.Value);
}
}
myRequest.ContentType = "application/json";
myRequest.UserAgent = userAgent; byte[] payload = null;
string jsonData = options.Paras.ToString();
if (!string.IsNullOrEmpty(jsonData))
{
payload = Encoding.UTF8.GetBytes(jsonData);
myRequest.ContentLength = payload.Length;
}
if (options.MyProxy != null)
{
myRequest.Proxy = options.MyProxy;
}
using (Stream mySream = myRequest.GetRequestStream())
{
if (payload != null && payload.Length > 0)
{
mySream.Write(payload, 0, payload.Length);
}
} try
{
using (HttpWebResponse myResponse = (HttpWebResponse)await myRequest.GetResponseAsync())
{
using (StreamReader myReader = new StreamReader(myResponse.GetResponseStream(), options.MyEncoding))
{
string responseText = myReader.ReadToEnd();
return responseText;
}
}
}
catch(WebException ex)
{
var res = (HttpWebResponse)ex.Response;
using (StreamReader myReader = new StreamReader(res.GetResponseStream(), options.MyEncoding))
{
string responseText = myReader.ReadToEnd();
return responseText;
}
}
catch (Exception ex)
{
options.MyException = ex;
return null;
}
}
#endregion #region HttpGet
public static string HttpGet(WebRequestOption options)
{
string formData = GetFormData(options.Paras);
if (options.SecurityProtocol != SecurityProtocolType.SystemDefault)
{
ServicePointManager.SecurityProtocol = options.SecurityProtocol;
}
string url = string.IsNullOrEmpty(formData) ? options.Url : options.Url + "?" + formData;
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.Method = "GET";
if (options.Headers.Count > 0)
{
foreach (var item in options.Headers)
{
myRequest.Headers.Add(item.Key, item.Value);
}
}
if (options.CC != null)
{
myRequest.CookieContainer = options.CC;
}
myRequest.UserAgent = userAgent;
if (url.StartsWith("https://"))
{
//myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentType = "application/json";
}
myRequest.Accept = "*/*";
myRequest.KeepAlive = true;
if (options.MyProxy != null)
{
myRequest.Proxy = options.MyProxy;
}
try
{
using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse())
{
using (Stream sResponse = myResponse.GetResponseStream())
{
using (StreamReader myReader = new StreamReader(sResponse, options.MyEncoding))
{
options.Status = myResponse.StatusCode;
string responseText = myReader.ReadToEnd();
return responseText;
}
}
}
}
catch (Exception ex)
{
options.MyException = ex;
return null;
}
} public static async Task<string> HttpGetAsync(WebRequestOption options)
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); string formData = GetFormData(options.Paras);
if (options.SecurityProtocol != SecurityProtocolType.SystemDefault)
{
ServicePointManager.SecurityProtocol = options.SecurityProtocol;
}
string url = string.IsNullOrEmpty(formData) ? options.Url : options.Url + "?" + formData;
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.Method = "GET";
if (options.Headers.Count > 0)
{
foreach (var item in options.Headers)
{
myRequest.Headers.Add(item.Key, item.Value);
}
}
if (options.CC != null)
{
myRequest.CookieContainer = options.CC;
}
myRequest.UserAgent = userAgent;
if (url.StartsWith("https://"))
{
//myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentType = "application/json";
}
myRequest.Accept = "*/*";
myRequest.KeepAlive = true;
if (options.MyProxy != null)
{
myRequest.Proxy = options.MyProxy;
}
try
{
using (HttpWebResponse myResponse = (HttpWebResponse)await myRequest.GetResponseAsync())
{
using (Stream sResponse = myResponse.GetResponseStream())
{
using (StreamReader myReader = new StreamReader(sResponse, options.MyEncoding))
{
options.Status = myResponse.StatusCode;
string responseText = myReader.ReadToEnd();
return responseText;
}
}
}
}
catch (Exception ex)
{
options.MyException = ex;
return null;
}
}
#endregion public static async Task<string> ExecQueryAsync(string url)
{
using (HttpClient httpClient = new HttpClient())
{
HttpResponseMessage response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string resultStr = await response.Content.ReadAsStringAsync();
return resultStr;
}
} private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
} #region 帮助方法
public static string GetFormData(object paras)
{
StringBuilder formData = new StringBuilder();
if (paras != null)
{
Type t = paras.GetType();
if (t.Name.Contains("Dictionary"))
{
foreach (KeyValuePair<String, String> kvp in paras as Dictionary<string, string>)
{
if (formData.ToString() == "")
{
formData.Append(kvp.Key + "=" + kvp.Value);
}
else
{
formData.Append("&" + kvp.Key + "=" + kvp.Value);
}
}
}
else if (t.Name == "String")
{
formData.Append(paras.ToString());
}
else
{
foreach (PropertyInfo pi in t.GetProperties())
{
var jsonProperty = pi.CustomAttributes.SingleOrDefault(p => p.AttributeType.FullName == "Newtonsoft.Json.JsonPropertyAttribute");
string name = jsonProperty == null ? pi.Name : jsonProperty.ConstructorArguments[0].Value.ToString();
object val = pi.GetValue(paras, null); if (formData.ToString() == "")
{
formData.Append(name + "=" + val);
}
else
{
formData.Append("&" + name + "=" + val);
}
}
}
}
return formData.ToString();
}
#endregion
}
public class WebRequestOption
{
public string Url { get; set; }
/// <summary>
/// 可以是匿名对象, 可以是字典
/// </summary>
public object Paras { get; set; }
public Dictionary<string, string> Headers = new Dictionary<string, string>();
public CookieContainer CC { get; set; }
public Encoding MyEncoding { get; set; }
public WebProxy MyProxy { get; set; }
public HttpStatusCode Status { get; set; }
public Exception MyException { get; set; }
public SecurityProtocolType SecurityProtocol { get; set; }
public string ContentType { get; set; } /// <summary>
/// 没有任何关于SecurityProtocold的默认设置
/// </summary>
public WebRequestOption()
{
if (this.MyEncoding == null)
{
this.MyEncoding = Encoding.UTF8;
}
}
/// <summary>
/// htts协议将默认设置为Tls1.0
/// </summary>
/// <param name="url"></param>
/// <param name="paras"></param>
public WebRequestOption(string url, object paras = null)
{
this.Url = url;
if (paras != null)
{
this.Paras = paras;
}
if (this.MyEncoding == null)
{
this.MyEncoding = Encoding.UTF8;
}
if (this.Url.StartsWith("https") && this.SecurityProtocol == SecurityProtocolType.SystemDefault)
{
this.SecurityProtocol = SecurityProtocolType.Tls12;
}
}
}
}
哈哈,这下爽了
WebRequestHelper的更多相关文章
- 请求WebApi的几种方式
目前所了解的请求WebAPI的方式有通过后台访问api 和通过js 直接访问api接口 首先介绍下通过后台访问api的方法,可以使用HttpClient的方式也可以使用WebRequest的方式 1. ...
- C# v3微信 access token 过期处理的问题
//记录access token 申请时的时间 private static DateTime GetAccessToken_Time; /// <summary> /// 过期时间为72 ...
- Magicodes.WeiChat——版本发布历史
购买地址:https://item.taobao.com/item.htm?id=520205558575 您可以在新标签页打开此图,以查看原始图片. Magicodes.WeiChat为湖南心莱信息 ...
- c#后台调用API
前两周赶上项目第一个版本上线,着实忙了一把,毕竟只有两个人负责.如今已完结,总算喘了一口气,现在任务就是写API.测API,许久之前写过JS前台调用 项目API,也写过后台调用开放的手机号归属地查询, ...
- C#使用Http的Post方式请求webservice
webservice是以前比较流行的跨系统.跨语言.跨平台的数据交互技术.最近工作中调用Java作为服务端开放的webser,我是通过VS205生成webservice工具类的方式进行接口调用的.用这 ...
- WebApi的调用-2.后台调用
httpClient调用方式 namespace SOA.Common { //httpClient调用WebApi public class HttpClientHelper { public st ...
- C#获取用户基本信息一(关注了公众号的用户)
一.获取Code 假设我们需要网页授权的页面的地址为redirect_uri 需要获取Code的话我们第一步是跳转到授权地址,我们第一步便是获取拼接授权地址 --采用snsapi_base方式 pu ...
- C#获取网页信息核心方法(入门一)
目录:信息采集入门系列目录 下面记录的是我自己整理的C#请求页面核心类,主要有如下几个方法 1.HttpWebRequest Get请求获得页面html 2.HttpWebRequest Post请求 ...
- 亲手搭建一个基于Asp.Net WebApi的项目基础框架2
本篇目的:封装一些抽象类 1::封装日志相关类 2:封装一个Service操作类 3:封装缓存操作类 4:封装其他一些常用Helper 1.1在Framework项目里面建立好相关操作类文件夹,以便于 ...
随机推荐
- struts extjs 3.3.1 读取JSON文件
json文件和脚本代码: jsonSrc/jsonTxt1.json, { "personInfoList": [ { "id": 0, "name& ...
- (七十二)自定义通知NSNotification实现消息传递
众所周知,iOS中一般在类之间传递消息使用较多的是delegate和block,还有一种是基于通知进行的消息传递,我们常常是使用系统的通知,来实现一些功能,例如利用键盘尺寸改变的通知,我们可以根据键盘 ...
- Android初级教程理论知识(第一章快速入门)
一.综合介绍. Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包, ...
- Java进阶(四)Java反射TypeToken解决泛型运行时类型擦除问题
在开发时,遇到了下面这条语句,不懂,然习之. private List<MyZhuiHaoDetailModel> listLottery = new ArrayList<MyZhu ...
- 通用数据水平层级选择控件v0.70升级版使其支持jQuery v1.9.1
升级原因:作者原来脚本支持的jquery版本太低了,查找了下资料,使得它能支持最新版本的jquery 备注说明:脚本代码源作者跟源文出处很难找,只能在此特感谢他的分享. 更新部分: 1.新版本不再支持 ...
- C3P0和DBCP的区别
C3P0和DBCP的区别 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. ...
- JAVA应用程序转换为Applet
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41673295 将一个图形的JAVA应用程序转换为能够嵌入在 ...
- CollapsingToolbarLayout使用
我们来看一下CollapsingToolbarLayout的使用场景. CollapsingToolbarLayout 可以看到,Toolbar的标题放大并在下方显示,当我们向上滑动列表时,顶部Hea ...
- git中failed to push some refs to git问题解决及基本使用
国庆归来准备试用一下git,在提交代码时遇到时遇到一些问题 提交时使用git push origin master 出现failed to push some refs to git 回想一下,创建该 ...
- rpcz VC2010 构建
rpcz VC2010 构建 rpcz 是应用ZeroMQ和Protobuf开发的RPC. 见: https://github.com/reinferio/rpcz 及 https://code.go ...