1. 程式人生 > >C#後臺傳送HTTP請求

C#後臺傳送HTTP請求

HttpResponse

1.涵蓋POST,GET方法

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace Common
{
    public class HttpResponse
    {
        #region
Static Field
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)"; #endregion Static Field #region public Method /// <summary> /// Get方法獲取Json資料 /// </summary>
/// <param name="url"></param> /// <returns></returns> public static string GetHttpResponseJson(string url, IWebProxy webProxy) { string json = string.Empty; Encoding encoding = Encoding.UTF8; HttpWebResponse Response = CreateGetHttpResponse(new
HttpGetParametersModel() { Url = url, WebProxy = webProxy }); json = GetStream(Response, encoding); return json; } /// <summary> /// Post Url獲取Json資料 /// </summary> /// <param name="url"></param> /// <returns></returns> public static string PostHttpResponseJson(string url, IWebProxy webProxy) { string json = string.Empty; Encoding encoding = Encoding.UTF8; HttpWebResponse Response = CreatePostHttpResponse(new HttpPostParametersModel() { Url = url, RequestEncoding = encoding, WebProxy = webProxy }); json = GetStream(Response, encoding); return json; } /// <summary> /// Post帶引數的 Url獲取Json資料 /// </summary> /// <param name="url"></param> /// <param name="postDict"></param> /// <returns></returns> public static string PostHttpResponseJson(string url, IWebProxy webProxy, IDictionary<string, string> postDict) { string json = string.Empty; Encoding encoding = Encoding.UTF8; HttpWebResponse Response = CreatePostHttpResponse(new HttpPostParametersModel() { Url = url, DictParameters = postDict, WebProxy = webProxy, RequestEncoding = encoding }); json = GetStream(Response, encoding); return json; } /// <summary> /// 建立GET方式的HTTP請求 /// </summary> /// <param name="url">請求的URL</param> /// <param name="timeout">請求的超時時間</param> /// <param name="userAgent">請求的客戶端瀏覽器資訊,可以為空</param> /// <param name="cookies">隨同HTTP請求傳送的Cookie資訊,如果不需要身份驗證可以為空</param> /// <returns></returns> public static HttpWebResponse CreateGetHttpResponse(HttpGetParametersModel getParametersModel) { if (string.IsNullOrEmpty(getParametersModel.Url)) { throw new ArgumentNullException("getParametersModel.Url"); } HttpWebRequest request = WebRequest.Create(getParametersModel.Url) as HttpWebRequest; if (getParametersModel.WebProxy != null) { request.Proxy = getParametersModel.WebProxy; } request.Method = "GET"; request.UserAgent = DefaultUserAgent; if (!string.IsNullOrEmpty(getParametersModel.UserAgent)) { request.UserAgent = getParametersModel.UserAgent; } if (getParametersModel.Timeout.HasValue) { request.Timeout = getParametersModel.Timeout.Value; } if (getParametersModel.Cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(getParametersModel.Cookies); } return request.GetResponse() as HttpWebResponse; } /// <summary> /// 建立POST方式的HTTP請求 /// </summary> /// <param name="url">請求的URL</param> /// <param name="parameters">隨同請求POST的引數名稱及引數值字典</param> /// <param name="timeout">請求的超時時間</param> /// <param name="userAgent">請求的客戶端瀏覽器資訊,可以為空</param> /// <param name="requestEncoding">傳送HTTP請求時所用的編碼</param> /// <param name="cookies">隨同HTTP請求傳送的Cookie資訊,如果不需要身份驗證可以為空</param> /// <returns></returns> public static HttpWebResponse CreatePostHttpResponse(HttpPostParametersModel postParametersModel) { if (string.IsNullOrEmpty(postParametersModel.Url)) { throw new ArgumentNullException("postParametersModel.Url"); } if (postParametersModel.RequestEncoding == null) { throw new ArgumentNullException("postParametersModel.RequestEncoding"); } HttpWebRequest request = null; //如果是傳送HTTPS請求 if (postParametersModel.Url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(postParametersModel.Url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(postParametersModel.Url) as HttpWebRequest; } if (postParametersModel.WebProxy != null) { request.Proxy = postParametersModel.WebProxy; } request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; if (!string.IsNullOrEmpty(postParametersModel.UserAgent)) { request.UserAgent = postParametersModel.UserAgent; } else { request.UserAgent = DefaultUserAgent; } if (postParametersModel.Timeout.HasValue) { request.Timeout = postParametersModel.Timeout.Value; } if (postParametersModel.Cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(postParametersModel.Cookies); } //如果需要POST資料 if (!(postParametersModel.DictParameters == null || postParametersModel.DictParameters.Count == 0)) { StringBuilder buffer = new StringBuilder(); int i = 0; foreach (string key in postParametersModel.DictParameters.Keys) { if (i > 0) { buffer.AppendFormat("&{0}={1}", key, postParametersModel.DictParameters[key]); } else { buffer.AppendFormat("{0}={1}", key, postParametersModel.DictParameters[key]); } i++; } byte[] data = postParametersModel.RequestEncoding.GetBytes(buffer.ToString()); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } } return request.GetResponse() as HttpWebResponse; } #endregion public Method #region Private Method /// <summary> /// 設定https證書校驗機制,預設返回True,驗證通過 /// </summary> /// <param name="sender"></param> /// <param name="certificate"></param> /// <param name="chain"></param> /// <param name="errors"></param> /// <returns></returns> private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //總是接受 } /// <summary> /// 將response轉換成文字 /// </summary> /// <param name="response"></param> /// <param name="encoding"></param> /// <returns></returns> private static string GetStream(HttpWebResponse response, Encoding encoding) { try { if (response.StatusCode == HttpStatusCode.OK) { switch (response.ContentEncoding.ToLower()) { case "gzip": { string result = Decompress(response.GetResponseStream(), encoding); response.Close(); return result; } default: { using (StreamReader sr = new StreamReader(response.GetResponseStream(), encoding)) { string result = sr.ReadToEnd(); sr.Close(); sr.Dispose(); response.Close(); return result; } } } } else { response.Close(); } } catch (Exception e) { throw e; } return ""; } private static string Decompress(Stream stream, Encoding encoding) { byte[] buffer = new byte[100]; //int length = 0; using (GZipStream gz = new GZipStream(stream, CompressionMode.Decompress)) { //GZipStream gzip = new GZipStream(res.GetResponseStream(), CompressionMode.Decompress); using (StreamReader reader = new StreamReader(gz, encoding)) { return reader.ReadToEnd(); } /* using (MemoryStream msTemp = new MemoryStream()) { //解壓時直接使用Read方法讀取內容,不能呼叫GZipStream例項的Length等屬性,否則會出錯:System.NotSupportedException: 不支援此操作; while ((length = gz.Read(buffer, 0, buffer.Length)) != 0) { msTemp.Write(buffer, 0, length); } return encoding.GetString(msTemp.ToArray()); } * */ } } #endregion Private Method #region 廢棄方法 /// <summary> /// 建立POST方式Json資料的HTTP請求(包括了https站點請求) /// </summary> /// <param name="url">請求的URL</param> /// <param name="parameters">隨同請求POST的引數名稱及引數值字典</param> /// <param name="timeout">請求的超時時間</param> /// <param name="userAgent">請求的客戶端瀏覽器資訊,可以為空</param> /// <param name="requestEncoding">傳送HTTP請求時所用的編碼</param> /// <param name="cookies">隨同HTTP請求傳送的Cookie資訊,如果不需要身份驗證可以為空</param> /// <returns></returns> [Obsolete("該方法暫時廢棄")] private HttpWebResponse CreatePostHttpResponseJson(string url, string postJson, string parameters, int? timeout, string userAgent, Encoding requestEncoding, string referer) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if (requestEncoding == null) { throw new ArgumentNullException("requestEncoding"); } HttpWebRequest request = null; //如果是傳送HTTPS請求 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"; //服務端 判斷 客戶端 提交的是否是 JSON資料 時 request.ContentType = "application/json;charset=UTF-8"; request.KeepAlive = true; if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } else { request.UserAgent = DefaultUserAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value; } //如果需要POST資料 #region post parameter 類似querystring格式 if (parameters != null) { byte[] data = requestEncoding.GetBytes(parameters); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); stream.Close(); } } #endregion post parameter 類似querystring格式 #region post json if (!string.IsNullOrEmpty(postJson)) { using (var streamWriter = new StreamWriter(request.GetRequestStream())) { //string json = "{\"user\":\"test\"," + // "\"password\":\"bla\"}"; streamWriter.Write(postJson); streamWriter.Flush(); streamWriter.Close(); } } #endregion post json if (!string.IsNullOrEmpty(referer)) { request.Referer = referer; } HttpWebResponse response = request.GetResponse() as HttpWebResponse; if (request.CookieContainer != null) { response.Cookies = request.CookieContainer.GetCookies(request.RequestUri); } return response; } #endregion 廢棄方法 } #region GET/POST請求引數模型 /// <summary> /// GET請求引數模型 /// </summary> public class HttpGetParametersModel { /// <summary> /// 請求的URL(GET方式就附加引數) /// </summary> public string Url { get; set; } /// <summary> /// 超時時間 /// </summary> public int? Timeout { get; set; } /// <summary> ///瀏覽器代理型別 /// </summary> public string UserAgent { get; set; } /// <summary> /// Web請求代理 /// </summary> public IWebProxy WebProxy { get; set; } /// <summary> /// Cookies列表 /// </summary> public CookieCollection Cookies { get; set; } } /// <summary> /// POST請求引數模型 /// </summary> public class HttpPostParametersModel : HttpGetParametersModel { /// <summary> /// POST引數字典 /// </summary> public IDictionary<string, string> DictParameters { get; set; } /// <summary> /// 傳送HTTP請求時所用的編碼 /// </summary> public Encoding RequestEncoding { get; set; } } #endregion GET/POST請求引數模型 }

WebProxy網站代理通過在Webconfig中設定

 <defaultProxy>
      <proxy
        usesystemdefault="True"
        proxyaddress="http://172.27.1.252:80"
        bypassonlocal="True" />
    </defaultProxy>

方法呼叫

   public static string GetBookInfoByISBNLinkAPI(string BookISBN)
        {
            try
            {
                string url ="https://api.douban.com/v2/book/isbn/9787500859062";
                return HttpResponse.GetHttpResponseJson(url, null);
            }
            catch (Exception e)
            {
                return "ISBN異常!";
            }
        }