(http的請求關鍵在於編碼 )
1.第一種請求
/// <summary>
/// Get請求
/// </summary>
/// <param name="url">請求的url</param>
/// <param name="reqHead">請求的頭部</param>
/// <returns></returns>
public static string Get(string url, string reqHead)
{
string result = "";
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
httpWebRequest.Method = "GET";
httpWebRequest.Headers.Add("Authorization", reqHead);
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
HttpWebResponse httpWebResponse;
try
{
httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
}
catch (WebException e)
{
httpWebResponse = (HttpWebResponse)e.Response;
}
Stream responseStream = httpWebResponse.GetResponseStream();
using (StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8))
{
result = streamReader.ReadToEnd();
}
return result;
}
/// <summary>
/// Post請求
/// </summary>
/// <param name="url">請求Url</param>
/// <param name="reqBody">請求內容</param>
/// <param name="reqHead">請求頭部</param>
/// <returns></returns>
public static string Post(string url, string reqBody, string reqHead)
{
string result = "";
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
httpWebRequest.Method = "POST";
httpWebRequest.Headers.Add("Authorization", reqHead);
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
byte[] bytes = Encoding.UTF8.GetBytes(reqBody);
httpWebRequest.ContentLength = (long)bytes.Length;
using (Stream requestStream = httpWebRequest.GetRequestStream())
{
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
}
HttpWebResponse httpWebResponse;
try
{
httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
}
catch (WebException e)
{
httpWebResponse = (HttpWebResponse)e.Response;
}
Stream responseStream = httpWebResponse.GetResponseStream();
using (StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8))
{
result = streamReader.ReadToEnd();
}
return result;
}
2.第二種方法:
/// <summary>
/// get請求
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetResponse(string url)
{
if (url.StartsWith("https"))
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient();
httpClient.DefaultRequestHeaders.Add("Accept-Language", "zh-CN,zh;q=0.9");
httpClient.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
httpClient.DefaultRequestHeaders.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
System.Net.Http.HttpResponseMessage response = httpClient.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
string result = response.Content.ReadAsStringAsync().Result;
return result;
}
return null;
}
/// <summary>
/// post請求
/// </summary>
/// <param name="url"></param>
/// <param name="postData">post數據</param>
/// <returns></returns>
public static string PostResponse(string url, string postData)
{
if (url.StartsWith("https"))
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
System.Net.Http.HttpContent httpContent = new System.Net.Http.StringContent(postData, Encoding.UTF8, "application/json");
System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient();
httpClient.DefaultRequestHeaders.Add("Accept-Language", "zh-CN,zh;q=0.9");
httpClient.DefaultRequestHeaders.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
System.Net.Http.HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
string result = response.Content.ReadAsStringAsync().Result;
return result;
}
return null;
}
3.第三種寫法:
//表明身份的作用域,這裏模擬瀏覽器IE
public static string _UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36";
public static CookieContainer cookieC = new CookieContainer();
public static string cookiestr = "";
/// <summary>
/// Get請求
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetHtml(string url)
{
//處理HttpWebRequest訪問https有安全證書的問題( 請求被中止: 未能創建 SSL/TLS 安全通道。)
//ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
//創建一個HTTP請求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = cookieC;
request.Headers.Add("Cookie:" + cookiestr);
//Get請求方式
request.Method = "GET";
request.Headers.Add("Access-Control-Allow-Origin", "*");
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
request.Headers.Add("Accept-Encoding", "gzip, deflate, br");
request.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9");
request.KeepAlive = true;
request.Host = "www.thaievisa.go.th";
request.Referer = "https://www.thaievisa.go.th/Home/Login";
//request.ContentType = "text/html; charset=utf-8";
request.UserAgent = _UserAgent;
String strValue = ""; //strValue爲http響應所返回的字符流
HttpWebResponse response;
try
{
//獲得響應流
response = (HttpWebResponse)request.GetResponse();
if (string.IsNullOrEmpty(cookiestr))
{
cookiestr = request.CookieContainer.GetCookieHeader(request.RequestUri) + ";" + cookiestr;
}
request.Headers.Add("Cookie:" + cookiestr);
}
catch (WebException ex)
{
response = ex.Response as HttpWebResponse;
}
Stream sm = response.GetResponseStream();
//使用了gzip壓縮流編碼時的處理
var ce = response.ContentEncoding;
if (ce.ToLower() == "gzip")
{
sm = new GZipStream(sm, CompressionMode.Decompress);
}
StreamReader streamReader = new StreamReader(sm, System.Text.Encoding.UTF8);
strValue = streamReader.ReadToEnd();
streamReader.Close();
sm.Close();
request.Abort();
response.Close();
return strValue;
}
/// <summary>
/// Post請求
/// </summary>
/// <param name="url">請求的地址</param>
/// <param name="data">提交數據</param>
/// <returns></returns>
public static string PostHtml(string url, string data = "")
{
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
//創建一個HTTP請求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = cookieC;
request.Headers.Add("Cookie:" + cookiestr);
//Post請求方式
request.Method = "POST";
request.Headers.Add("Access-Control-Allow-Origin", "*");
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
request.Headers.Add("Accept-Encoding", "gzip, deflate, br");
request.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9");
request.KeepAlive = true;
request.Host = "www.thaievisa.go.th";
request.Headers.Add("Origin", "https://www.thaievisa.go.th");
request.Referer = "https://www.thaievisa.go.th/Home/Login";
//內容類型
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
request.UserAgent = _UserAgent;
byte[] payload;
//將Json字符串轉化爲字節
payload = System.Text.Encoding.UTF8.GetBytes(data);
//設置請求的ContentLength
request.ContentLength = payload.Length;
//發送請求,獲得請求流
Stream writer;
try
{
writer = request.GetRequestStream();//獲取用於寫入請求數據的Stream對象
}
catch (Exception)
{
writer = null;
string msg = "連接服務器失敗!";
return msg;
}
//將請求參數寫入流
writer.Write(payload, 0, payload.Length);
writer.Close(); //關閉請求流
String strValue = ""; //strValue爲http響應所返回的字符流
HttpWebResponse response;
try
{
//獲得響應流
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
response = ex.Response as HttpWebResponse;
}
Stream s = response.GetResponseStream();
//使用了gzip壓縮流編碼時的處理
var ce = response.ContentEncoding;
if (ce.ToLower() == "gzip")
{
s = new GZipStream(s, CompressionMode.Decompress);
}
StreamReader streamReader = new StreamReader(s, System.Text.Encoding.UTF8);
strValue = streamReader.ReadToEnd();
streamReader.Close();
s.Close();
request.Abort();
response.Close();
return strValue; //返回Json數據
}