基於.NET Core 框架搭建WebApi專案
阿新 • • 發佈:2019-02-01
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace Common
{
/// <summary>
/// HttpClient的幫助類
/// 2015年11月12日14:43:45
/// </summary>
public class HttpClientHelper
{
/*Edit Desc: 提取預設的Http Heads UserAgen Author:Xuja Time:2016-5-3 16:46:29*/
private static readonly string userAgen = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36";
/// <summary>
/// 根據Url地址Get請求返回資料
/// 2015年11月12日14:50:02
/// </summary>
/// <param name="url">請求的地址</param>
/// <param name="ch_httpcode">http狀態碼</param>
/// <returns>字串</returns>
public static string GetResponse(string url, out string httpStatusCode)
{
httpStatusCode = string.Empty;
HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip });
HttpResponseMessage response = null;
try
{
//httpClient.MaxResponseContentBufferSize = 256000;
httpClient.DefaultRequestHeaders.Add("user-agent", userAgen);
//httpClient = new HttpClient();
//using (HttpClient httpClient = new HttpClient())
//{
httpClient.CancelPendingRequests();
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
Task<HttpResponseMessage> taskResponse = httpClient.GetAsync(url);
taskResponse.Wait();
response = taskResponse.Result;
//using (HttpResponseMessage response = taskResponse.Result)
//{
//HttpResponseMessage response = httpClient.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync();
taskStream.Wait();
//此處會丟擲異常:不支援超時設定,對返回結果沒有影響
System.IO.Stream dataStream = taskStream.Result;
System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
string result = reader.ReadToEnd();
return result;
}
//}
return null;
//}
}
catch
{
return null;
}
finally
{
if (response != null)
{
response.Dispose();
}
if (httpClient != null)
{
httpClient.Dispose();
}
}
}
/// <summary>
/// 根據Url地址Get請求返回資料
/// xuja
/// 2015年11月12日14:50:02
/// </summary>
/// <param name="url">請求的地址</param>
/// <returns>字串</returns>
public static string GetResponse(string url)
{
HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip });
HttpResponseMessage response = null;
try
{
//httpClient.MaxResponseContentBufferSize = 256000;
httpClient.DefaultRequestHeaders.Add("user-agent", userAgen);
//httpClient = new HttpClient();
//using (HttpClient httpClient = new HttpClient())
//{
httpClient.CancelPendingRequests();
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
Task<HttpResponseMessage> taskResponse = httpClient.GetAsync(url);
taskResponse.Wait();
response = taskResponse.Result;
//using (HttpResponseMessage response = taskResponse.Result)
//{
//HttpResponseMessage response = httpClient.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync();
taskStream.Wait();
System.IO.Stream dataStream = taskStream.Result;
System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
string result = reader.ReadToEnd();
return result;
}
//}
return null;
//}
}
catch
{
return null;
}
finally
{
if (response != null)
{
response.Dispose();
}
if (httpClient != null)
{
httpClient.Dispose();
}
}
}
/// <summary>
/// 根據Url地址Get請求返回實體
/// xuja
/// 2015年11月12日14:50:02
/// </summary>
/// <param name="url">請求的地址</param>
/// <returns>實體</returns>
public static T GetResponse<T>(string url)
{
HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip });
HttpResponseMessage response = null;
try
{
//using (HttpClient httpClient = new HttpClient())
//{
//httpClient.MaxResponseContentBufferSize = 256000;
httpClient.DefaultRequestHeaders.Add("user-agent", userAgen);
httpClient.CancelPendingRequests();
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
//HttpResponseMessage response = httpClient.GetAsync(url).Result;
Task<HttpResponseMessage> taskResponse = httpClient.GetAsync(url);
taskResponse.Wait();
T result = default(T);
response = taskResponse.Result;
//using (HttpResponseMessage response = taskResponse.Result)
//{
if (response.IsSuccessStatusCode)
{
Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync();
taskStream.Wait();
System.IO.Stream dataStream = taskStream.Result;
System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
string s = reader.ReadToEnd();
result = JsonConvertTool.DeserializeObject<T>(s);
}
//}
return result;
//}
}
catch (Exception e)
{
var resp = new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent(e.ToString()),
ReasonPhrase = "error"
};
//throw new HttpResponseException(resp);
return default(T);
}
finally
{
if (response != null)
{
response.Dispose();
}
if (httpClient != null)
{
httpClient.Dispose();
}
}
}
/// <summary>
/// 處理Get的Url
/// des:huyf
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
public static string WithParameters(Dictionary<string, string> dic)
{
string result = "?";
foreach (var item in dic)
{
result += item.Key + "=" + item.Value + "&";
}
result = result.Remove(result.Length - 1);
return result;
}
/// <summary>
/// Post請求返回字元
/// </summary>
/// <param name="url">請求地址</param>
/// <param name="postData">請求資料</param>
/// <returns>字元</returns>
public static string PostResponse(string url, string postData)
{
HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip });
HttpResponseMessage response = null;
try
{
//using (HttpClient httpClient = new HttpClient())
//{
httpClient.MaxResponseContentBufferSize = 256000;
httpClient.DefaultRequestHeaders.Add("user-agent", userAgen);
httpClient.CancelPendingRequests();
httpClient.DefaultRequestHeaders.Clear();
HttpContent httpContent = new StringContent(postData);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
Task<HttpResponseMessage> taskResponse = httpClient.PostAsync(url, httpContent);
taskResponse.Wait();
response = taskResponse.Result;
//using (HttpResponseMessage response = taskResponse.Result)
//{
//HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync();
taskStream.Wait();
System.IO.Stream dataStream = taskStream.Result;
System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
string result = reader.ReadToEnd();
return result;
}
//}
return null;
//}
}
catch
{
return null;
}
finally
{
if (response != null)
{
response.Dispose();
}
if (httpClient != null)
{
httpClient.Dispose();
}
}
}
/// <summary>
/// Post請求返回字元
/// </summary>
/// <param name="url">請求地址</param>
/// <param name="postData">請求資料</param>
/// <returns>字元</returns>
public static string PostResponse(string url, object obj)
{
HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip });
HttpResponseMessage response = null;
try
{
//using (HttpClient httpClient = new HttpClient())
//{
httpClient.MaxResponseContentBufferSize = 256000;
httpClient.DefaultRequestHeaders.Add("user-agent", userAgen);
httpClient.CancelPendingRequests();
httpClient.DefaultRequestHeaders.Clear();
string postData = JsonConvertTool.SerializeObject(obj);
HttpContent httpContent = new StringContent(postData);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
Task<HttpResponseMessage> taskResponse = httpClient.PostAsync(url, httpContent);
taskResponse.Wait();
response = taskResponse.Result;
//using (HttpResponseMessage response = taskResponse.Result)
//{
//HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync();
taskStream.Wait();
System.IO.Stream dataStream = taskStream.Result;
System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
string result = reader.ReadToEnd();
return result;
}
else
{
//LogHelper.WriteInfo(typeof(HttpClientHelper), "結果:" + response.StatusCode + "內容:" + JsonConvertTool.SerializeObject(obj));
}
//}
return null;
//}
}
catch (Exception exception)
{
//LogHelper.Error("結果:異常 內容:" + JsonConvertTool.SerializeObject(obj) + "ex:" + exception.Message, exception);
return null;
}
finally
{
if (response != null)
{
response.Dispose();
}
if (httpClient != null)
{
httpClient.Dispose();
}
}
}
/// <summary>
/// Post請求返回實體
/// </summary>
/// <param name="url">請求地址</param>
/// <param name="postData">請求資料</param>
/// <returns>實體</returns>
public static T PostResponse<T>(string url, string postData)
{
HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip });
HttpResponseMessage response = null;
try
{
//using (HttpClient httpClient = new HttpClient())
//{
httpClient.MaxResponseContentBufferSize = 256000;
httpClient.DefaultRequestHeaders.Add("user-agent", userAgen);
httpClient.CancelPendingRequests();
httpClient.DefaultRequestHeaders.Clear();
HttpContent httpContent = new StringContent(postData);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
T result = default(T);
Task<HttpResponseMessage> taskResponse = httpClient.PostAsync(url, httpContent);
taskResponse.Wait();
response = taskResponse.Result;
//using (HttpResponseMessage response = taskResponse.Result)
//{
//HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync();
taskStream.Wait();
System.IO.Stream dataStream = taskStream.Result;
System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
string s = reader.ReadToEnd();
result = JsonConvertTool.DeserializeObject<T>(s);
}
//}
return result;
//}
}
catch
{
return default(T);
}
finally
{
if (response != null)
{
response.Dispose();
}
if (httpClient != null)
{
httpClient.Dispose();
}
}
}
/// <summary>
/// Post請求返回實體
/// </summary>
/// <param name="url">請求地址</param>
/// <param name="postData">請求資料</param>
/// <returns>實體</returns>
public static T PostResponse<T>(string url, object obj)
{
HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip });
HttpResponseMessage response = null;
try
{
//using (HttpClient httpClient = new HttpClient())
//{
httpClient.MaxResponseContentBufferSize = 256000;
httpClient.DefaultRequestHeaders.Add("user-agent", userAgen);
httpClient.CancelPendingRequests();
httpClient.DefaultRequestHeaders.Clear();
string postData = JsonConvertTool.SerializeObject(obj);
HttpContent httpContent = new StringContent(postData);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
T result = default(T);
Task<HttpResponseMessage> taskResponse = httpClient.PostAsync(url, httpContent);
taskResponse.Wait();
response = taskResponse.Result;
//using (HttpResponseMessage response = taskResponse.Result)
//{
//HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync();
taskStream.Wait();
System.IO.Stream dataStream = taskStream.Result;
System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
string s = reader.ReadToEnd();
result = JsonConvertTool.DeserializeObject<T>(s);
}
//}
return result;
//}
}
catch
{
return default(T);
}
finally
{
if (response != null)
{
response.Dispose();
}
if (httpClient != null)
{
httpClient.Dispose();
}
}
}
/// <summary>
/// Put請求返回字元
/// </summary>
/// <param name="url">請求地址</param>
/// <param name="postData">請求資料</param>
/// <returns>字元</returns>
public static string PutResponse(string url, object obj)
{
HttpClient httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip });
HttpResponseMessage response = null;
try
{
//using (HttpClient httpClient = new HttpClient())
//{
httpClient.MaxResponseContentBufferSize = 256000;
httpClient.DefaultRequestHeaders.Add("user-agent", userAgen);
httpClient.CancelPendingRequests();
httpClient.DefaultRequestHeaders.Clear();
string postData = JsonConvertTool.SerializeObject(obj);
HttpContent httpContent = new StringContent(postData);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
Task<HttpResponseMessage> taskResponse = httpClient.PostAsync(url, httpContent);
taskResponse.Wait();
response = taskResponse.Result;
//using (HttpResponseMessage response = taskResponse.Result)
//{
//HttpResponseMessage response = httpClient.PutAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
Task<System.IO.Stream> taskStream = response.Content.ReadAsStreamAsync();
taskStream.Wait();
System.IO.Stream dataStream = taskStream.Result;
System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
string result = reader.ReadToEnd();
return result;
}
//}
return null;
//}
}
catch
{
return null;
}
finally
{
if (response != null)
{
response.Dispose();
}
if (httpClient != null)
{
httpClient.Dispose();
}
}
}
/// <summary>
/// 將Http狀態碼翻譯為對應的中文【暫未使用】
/// </summary>
/// <param name="code">Http狀態碼</param>
/// <returns>中文解析</returns>
public static string ToChsText(HttpStatusCode code)
{
switch (code)
{
case HttpStatusCode.Continue:
return "請求者應繼續進行請求";
case HttpStatusCode.SwitchingProtocols:
return "請求者已要求伺服器切換協議,伺服器已確認並準備進行切換";
case HttpStatusCode.OK:
return "伺服器成功處理了相應請求";
case HttpStatusCode.Created:
return "請求成功且伺服器已建立了新的資源";
case HttpStatusCode.Accepted:
return "伺服器已接受相應請求,但尚未對其進行處理";
case HttpStatusCode.NonAuthoritativeInformation:
return "伺服器已成功處理相應請求,但返回了可能來自另一來源的資訊";
case HttpStatusCode.NoContent:
return "伺服器已成功處理相應請求,但未返回任何內容";
case HttpStatusCode.ResetContent:
return "伺服器已成功處理相應請求,但未返回任何內容,但要求請求者重置文件檢視";
case HttpStatusCode.PartialContent:
return "伺服器成功處理了部分 GET 請求";
case HttpStatusCode.MultipleChoices:
return "伺服器可以根據請求來執行多項操作";
case HttpStatusCode.Moved:
return "請求的網頁已永久移動到新位置";
case HttpStatusCode.Redirect:
return "伺服器目前正從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求";
case HttpStatusCode.RedirectMethod:
return "當請求者應對不同的位置進行單獨的 GET 請求以檢索響應時,伺服器會返回此程式碼";
case HttpStatusCode.NotModified:
return "請求的網頁自上次請求後再也沒有修改過";
case HttpStatusCode.UseProxy:
return "請求者只能使用代理訪問請求的網頁";
case HttpStatusCode.Unused:
return "Unused 是未完全指定的 HTTP/1.1 規範的建議擴充套件";
case HttpStatusCode.RedirectKeepVerb:
return "伺服器目前正從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求";
case HttpStatusCode.BadRequest:
return "伺服器未能識別請求";
case HttpStatusCode.Unauthorized:
return "請求要求進行身份驗證";
case HttpStatusCode.PaymentRequired:
return "保留 PaymentRequired 以供將來使用";
case HttpStatusCode.Forbidden:
return "伺服器拒絕相應請求";
case HttpStatusCode.NotFound:
return "伺服器找不到請求的資源";
case HttpStatusCode.MethodNotAllowed:
return "禁用相應請求中所指定的方法";
case HttpStatusCode.NotAcceptable:
return "無法使用相應請求的內容特性來響應請求的網頁";
case HttpStatusCode.ProxyAuthenticationRequired:
return "請求者應當使用代理進行授權";
case HttpStatusCode.RequestTimeout:
return "伺服器在等待請求時超時";
case HttpStatusCode.Conflict:
return "伺服器在完成請求時遇到衝突";
case HttpStatusCode.Gone:
return "請求的資源已被永久刪除";
case HttpStatusCode.LengthRequired:
return "伺服器不會接受包含無效內容長度標頭欄位的請求";
case HttpStatusCode.PreconditionFailed:
return "伺服器未滿足請求者在請求中設定的其中一個前提條件";
case HttpStatusCode.RequestEntityTooLarge:
return "伺服器無法處理相應請求,因為請求實體過大,已超出伺服器的處理能力";
case HttpStatusCode.RequestUriTooLong:
return "請求的 URI 過長,伺服器無法進行處理";
case HttpStatusCode.UnsupportedMediaType:
return "相應請求的格式不受請求頁面的支援";
case HttpStatusCode.RequestedRangeNotSatisfiable:
return "如果相應請求是針對網頁的無效範圍進行的,那麼伺服器會返回此狀態程式碼";
case HttpStatusCode.ExpectationFailed:
return "伺服器未滿足“期望”請求標頭欄位的要求";
case HttpStatusCode.InternalServerError:
return "伺服器內部遇到錯誤,無法完成相應請求";
case HttpStatusCode.NotImplemented:
return "請求的功能在伺服器中尚未實現";
case HttpStatusCode.BadGateway:
return "伺服器作為閘道器或代理,從上游伺服器收到了無效的響應";
case HttpStatusCode.ServiceUnavailable:
return "目前伺服器不可用(由於超載或進行停機維護)";
case HttpStatusCode.GatewayTimeout:
return "伺服器作為閘道器或代理,未及時從上游伺服器接收請求";
case HttpStatusCode.HttpVersionNotSupported:
return "伺服器不支援相應請求中所用的 HTTP 協議版本";
default:
return "未知Http狀態";
}
}
}
}