生活随笔
收集整理的這篇文章主要介紹了
C# HttpWebRequest GET HTTP HTTPS 请求
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這個(gè)需求來(lái)自于我最近練手的一個(gè)項(xiàng)目,在項(xiàng)目中我需要將一些自己發(fā)表的和收藏整理的網(wǎng)文集中到一個(gè)地方存放,如果全部采用手工操作工作量大而且繁瑣,因此周公決定利用C#來(lái)實(shí)現(xiàn)。在很多地方都需要驗(yàn)證用戶身份才可以進(jìn)行下一步操作,這就免不了POST請(qǐng)求來(lái)登錄,在實(shí)際過(guò)程中發(fā)現(xiàn)有些網(wǎng)站登錄是HTTPS形式的,在解決過(guò)程中遇到了一些小問(wèn)題,現(xiàn)在跟大家分享。
通用輔助類
下面是我編寫的一個(gè)輔助類,在這個(gè)類中采用了HttpWebRequest中發(fā)送GET/HTTP/HTTPS請(qǐng)求,因?yàn)橛械臅r(shí)候需要獲取認(rèn)證信息(如Cookie),所以返回的是HttpWebResponse對(duì)象,有了返回的HttpWebResponse實(shí)例,可以獲取登錄過(guò)程中返回的會(huì)話信息,也可以獲取響應(yīng)流。
代碼如下:
using System;
using System.Collections.Generic;
using System.Linq; using System.Text; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.DirectoryServices.Protocols; using System.ServiceModel.Security; using System.Net; using System.IO; using System.IO.Compression; using System.Text.RegularExpressions; namespace BaiduCang { /// <summary> /// 有關(guān)HTTP請(qǐng)求的輔助類 /// </summary> public class HttpWebResponseUtility { private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; /// <summary> /// 創(chuàng)建GET方式的HTTP請(qǐng)求 /// </summary> /// <param name="url">請(qǐng)求的URL</param> /// <param name="timeout">請(qǐng)求的超時(shí)時(shí)間</param> /// <param name="userAgent">請(qǐng)求的客戶端瀏覽器信息,可以為空</param> /// <param name="cookies">隨同HTTP請(qǐng)求發(fā)送的Cookie信息,如果不需要身份驗(yàn)證可以為空</param> /// <returns></returns> public static HttpWebResponse CreateGetHttpResponse(string url,int? timeout, string userAgent,CookieCollection cookies) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Method = "GET"; request.UserAgent = DefaultUserAgent; if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } return request.GetResponse() as HttpWebResponse; } /// <summary> /// 創(chuàng)建POST方式的HTTP請(qǐng)求 /// </summary> /// <param name="url">請(qǐng)求的URL</param> /// <param name="parameters">隨同請(qǐng)求POST的參數(shù)名稱及參數(shù)值字典</param> /// <param name="timeout">請(qǐng)求的超時(shí)時(shí)間</param> /// <param name="userAgent">請(qǐng)求的客戶端瀏覽器信息,可以為空</param> /// <param name="requestEncoding">發(fā)送HTTP請(qǐng)求時(shí)所用的編碼</param> /// <param name="cookies">隨同HTTP請(qǐng)求發(fā)送的Cookie信息,如果不需要身份驗(yàn)證可以為空</param> /// <returns></returns> public static HttpWebResponse CreatePostHttpResponse(string url,IDictionary<string,string> parameters,int? timeout, string userAgent,Encoding requestEncoding,CookieCollection cookies) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if(requestEncoding==null) { throw new ArgumentNullException("requestEncoding"); } HttpWebRequest request=null; //如果是發(fā)送HTTPS請(qǐng)求 if(url.StartsWith("https",StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion=HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } else { request.UserAgent = DefaultUserAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } //如果需要POST數(shù)據(jù) if(!(parameters==null||parameters.Count==0)) { StringBuilder buffer = new StringBuilder(); int i = 0; foreach (string key in parameters.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, parameters[key]); } else { buffer.AppendFormat("{0}={1}", key, parameters[key]); } i++; } byte[] data = requestEncoding.GetBytes(buffer.ToString()); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } } return request.GetResponse() as HttpWebResponse; } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //總是接受