C# HttpClient請求Webapi幫助類

引用 Newtonsoft.Json  json

        // Post請求
        public string PostResponse(string url,string postData,out string statusCode)
        {
            string result = string.Empty;
            //設置Http的正文
            HttpContent httpContent = new StringContent(postData);
            //設置Http的內容標頭
            httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            //設置Http的內容標頭的字符
            httpContent.Headers.ContentType.CharSet = "utf-8";
            using(HttpClient httpClient=new HttpClient())
            {
                //異步Post
                HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
                //輸出Http響應狀態碼
                statusCode = response.StatusCode.ToString();
                //確保Http響應成功
                if (response.IsSuccessStatusCode)
                {
                    //異步讀取json
                    result = response.Content.ReadAsStringAsync().Result;
                }
            }
            return result;
        }

        // 泛型:Post請求
        public T PostResponse<T>(string url,string postData) where T:class,new()
        {
            T result = default(T);
 
            HttpContent httpContent = new StringContent(postData);
            httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            httpContent.Headers.ContentType.CharSet = "utf-8";
            using(HttpClient httpClient=new HttpClient())
            {
                HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
 
                if (response.IsSuccessStatusCode)
                {
                    Task<string> t = response.Content.ReadAsStringAsync();
                    string s = t.Result;
                    //Newtonsoft.Json
                    string json = JsonConvert.DeserializeObject(s).ToString();
                    result = JsonConvert.DeserializeObject<T>(json); 
                }
            }
            return result;
        }

        // 泛型:Get請求
        public T GetResponse<T>(string url) where T :class,new()
        {
            T result = default(T);
 
            using (HttpClient httpClient=new HttpClient())
            {
                httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
                HttpResponseMessage response = httpClient.GetAsync(url).Result;
 
                if (response.IsSuccessStatusCode)
                {
                    Task<string> t = response.Content.ReadAsStringAsync();
                    string s = t.Result;
                    string json = JsonConvert.DeserializeObject(s).ToString();
                    result = JsonConvert.DeserializeObject<T>(json);
                }
            }
            return result;
        }

        // Get請求
        public string GetResponse(string url, out string statusCode)
        {
            string result = string.Empty;
 
            using (HttpClient httpClient = new HttpClient())
            {
                httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
 
                HttpResponseMessage response = httpClient.GetAsync(url).Result;
                statusCode = response.StatusCode.ToString();
 
                if (response.IsSuccessStatusCode)
                {
                    result = response.Content.ReadAsStringAsync().Result;
                }
            }
            return result;
        }

        // Put請求
        public string PutResponse(string url, string putData, out string statusCode)
        {
            string result = string.Empty;
            HttpContent httpContent = new StringContent(putData);
            httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            httpContent.Headers.ContentType.CharSet = "utf-8";
            using (HttpClient httpClient = new HttpClient())
            {
                HttpResponseMessage response = httpClient.PutAsync(url, httpContent).Result;
                statusCode = response.StatusCode.ToString();
                if (response.IsSuccessStatusCode)
                {
                    result = response.Content.ReadAsStringAsync().Result;
                }
            }
            return result;
        }

        // 泛型:Put請求
        public T PutResponse<T>(string url, string putData) where T : class, new()
        {
            T result = default(T);
            HttpContent httpContent = new StringContent(putData);
            httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            httpContent.Headers.ContentType.CharSet = "utf-8";
            using(HttpClient httpClient=new HttpClient())
            {
                HttpResponseMessage response = httpClient.PutAsync(url, httpContent).Result;
 
                if (response.IsSuccessStatusCode)
                {
                    Task<string> t = response.Content.ReadAsStringAsync();
                    string s = t.Result;
                    string json = JsonConvert.DeserializeObject(s).ToString();
                    result = JsonConvert.DeserializeObject<T>(json);
                }
            }
            return result;
        }

 

出處:https://blog.csdn.net/sun_zeliang/article/details/81587835api

========================================================app

我本身把上面的修改下,能夠不引用 Newtonsoft.Json  ,在POST模式的方法PostWebAPI增長了GZip的支持,請求超時設置,其餘的功能能夠本身去擴展,增長了簡單調用的方式。異步

後續能夠擴展異步方式、HttpWebRequest方式調用Webapi(待完成。。。)ide

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;



namespace Car.AutoUpdate.Comm
{
    public class WebapiHelper
    {

        #region HttpClient

        /// <summary>
        /// Get請求指定的URL地址
        /// </summary>
        /// <param name="url">URL地址</param>
        /// <returns></returns>
        public static string GetWebAPI(string url)
        {
            string result = "";
            string strOut = "";
            try
            {
                result = GetWebAPI(url, out strOut);
            }
            catch (Exception ex)
            {
                LogHelper.Error("調用後臺服務出現異常!", ex);
            }
            return result;
        }

        /// <summary>
        /// Get請求指定的URL地址
        /// </summary>
        /// <param name="url">URL地址</param>
        /// <param name="statusCode">Response返回的狀態</param>
        /// <returns></returns>
        public static string GetWebAPI(string url, out string statusCode)
        {
            string result = string.Empty;
            statusCode = string.Empty;
            try
            {
                using (HttpClient httpClient = new HttpClient())
                {
                    httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

                    HttpResponseMessage response = httpClient.GetAsync(url).Result;
                    statusCode = response.StatusCode.ToString();

                    if (response.IsSuccessStatusCode)
                    {
                        result = response.Content.ReadAsStringAsync().Result;
                    }
                    else
                    {
                        LogHelper.Warn("調用後臺服務返回失敗:" + url + Environment.NewLine + SerializeObject(response));
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("調用後臺服務出現異常!", ex);
            }
            return result;
        }

        /// <summary>
        /// Get請求指定的URL地址
        /// </summary>
        /// <typeparam name="T">返回的json轉換成指定實體對象</typeparam>
        /// <param name="url">URL地址</param>
        /// <returns></returns>
        public static T GetWebAPI<T>(string url) where T : class, new()
        {
            T result = default(T);
            try
            {
                using (HttpClient httpClient = new HttpClient())
                {
                    httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
                    HttpResponseMessage response = httpClient.GetAsync(url).Result;

                    if (response.IsSuccessStatusCode)
                    {
                        Task<string> t = response.Content.ReadAsStringAsync();
                        string s = t.Result;
                        string jsonNamespace = DeserializeObject<T>(s).ToString();
                        result = DeserializeObject<T>(s);
                    }
                    else
                    {
                        LogHelper.Warn("調用後臺服務返回失敗:" + url + Environment.NewLine + SerializeObject(response));
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("調用後臺服務出現異常!", ex);
            }

            return result;
        }

        /// <summary>
        /// Post請求指定的URL地址
        /// </summary>
        /// <param name="url">URL地址</param>
        /// <param name="postData">提交到Web的Json格式的數據:如:{"ErrCode":"FileErr"}</param>
        /// <returns></returns>
        public static string PostWebAPI(string url, string postData)
        {
            string result = "";
            HttpStatusCode strOut = HttpStatusCode.BadRequest;
            try
            {
                result = PostWebAPI(url, postData, out strOut);
            }
            catch (Exception ex)
            {
                LogHelper.Error("調用後臺服務出現異常!", ex);
            }
            return result;

        }

        /// <summary>
        /// Post請求指定的URL地址
        /// </summary>
        /// <param name="url">URL地址</param>
        /// <param name="postData">提交到Web的Json格式的數據:如:{"ErrCode":"FileErr"}</param>
        /// <param name="statusCode">Response返回的狀態</param>
        /// <returns></returns>
        public static string PostWebAPI(string url, string postData, out HttpStatusCode httpStatusCode)
        {
            string result = string.Empty;
            httpStatusCode = HttpStatusCode.BadRequest;
            //設置Http的正文
            HttpContent httpContent = new StringContent(postData);
            //設置Http的內容標頭
            httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            //設置Http的內容標頭的字符
            httpContent.Headers.ContentType.CharSet = "utf-8";

            HttpClientHandler httpHandler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
            try
            {
                //using (HttpClient httpClient = new HttpClient(httpHandler))
                using (HttpClient httpClient = new HttpClient())
                {
                    httpClient.Timeout = new TimeSpan(0, 0, 5);
                    //異步Post
                    HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
                    //輸出Http響應狀態碼
                    httpStatusCode = response.StatusCode;
                    //確保Http響應成功
                    if (response.IsSuccessStatusCode)
                    {
                        //異步讀取json
                        result = response.Content.ReadAsStringAsync().Result;
                    }
                    else
                    {
                        LogHelper.Warn("調用後臺服務返回失敗:" + url + Environment.NewLine + SerializeObject(response));
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("調用後臺服務出現異常!", ex);
            }
            return result;
        }

        /// <summary>
        /// Post請求指定的URL地址
        /// </summary>
        /// <typeparam name="T">返回的json轉換成指定實體對象</typeparam>
        /// <param name="url">URL地址</param>
        /// <param name="postData">提交到Web的Json格式的數據:如:{"ErrCode":"FileErr"}</param>
        /// <returns></returns>
        public static T PostWebAPI<T>(string url, string postData) where T : class, new()
        {
            T result = default(T);

            HttpContent httpContent = new StringContent(postData);
            httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            httpContent.Headers.ContentType.CharSet = "utf-8";

            HttpClientHandler httpHandler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
            try
            {
                using (HttpClient httpClient = new HttpClient(httpHandler))
                {
                    HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;

                    if (response.IsSuccessStatusCode)
                    {
                        Task<string> t = response.Content.ReadAsStringAsync();
                        string s = t.Result;
                        //Newtonsoft.Json
                        string jsonNamespace = DeserializeObject<T>(s).ToString();
                        result = DeserializeObject<T>(s);
                    }
                    else
                    {
                        LogHelper.Warn("調用後臺服務返回失敗:" + url + Environment.NewLine + SerializeObject(response));
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("調用後臺服務出現異常!", ex);
            }
            return result;
        }

        /// <summary>
        /// Put請求指定的URL地址
        /// </summary>
        /// <param name="url">URL地址</param>
        /// <param name="putData">提交到Web的Json格式的數據:如:{"ErrCode":"FileErr"}</param>
        /// <returns></returns>
        public static string PutWebAPI(string url, string putData)
        {
            string result = "";
            string strOut = "";
            result = PutWebAPI(url, putData, out strOut);
            return result;
        }

        /// <summary>
        /// Put請求指定的URL地址
        /// </summary>
        /// <param name="url">URL地址</param>
        /// <param name="putData">提交到Web的Json格式的數據:如:{"ErrCode":"FileErr"}</param>
        /// <param name="statusCode">Response返回的狀態</param>
        /// <returns></returns>
        public static string PutWebAPI(string url, string putData, out string statusCode)
        {
            string result = statusCode = string.Empty;
            HttpContent httpContent = new StringContent(putData);
            httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            httpContent.Headers.ContentType.CharSet = "utf-8";
            try
            {
                using (HttpClient httpClient = new HttpClient())
                {
                    HttpResponseMessage response = httpClient.PutAsync(url, httpContent).Result;
                    statusCode = response.StatusCode.ToString();
                    if (response.IsSuccessStatusCode)
                    {
                        result = response.Content.ReadAsStringAsync().Result;
                    }
                    else
                    {
                        LogHelper.Warn("調用後臺服務返回失敗:" + url + Environment.NewLine + SerializeObject(response));
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("調用後臺服務出現異常!", ex);
            }
            return result;
        }

        /// <summary>
        /// Put請求指定的URL地址
        /// </summary>
        /// <typeparam name="T">返回的json轉換成指定實體對象</typeparam>
        /// <param name="url">URL地址</param>
        /// <param name="putData">提交到Web的Json格式的數據:如:{"ErrCode":"FileErr"}</param>
        /// <returns></returns>
        public static T PutWebAPI<T>(string url, string putData) where T : class, new()
        {
            T result = default(T);
            HttpContent httpContent = new StringContent(putData);
            httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            httpContent.Headers.ContentType.CharSet = "utf-8";
            try
            {
                using (HttpClient httpClient = new HttpClient())
                {
                    HttpResponseMessage response = httpClient.PutAsync(url, httpContent).Result;

                    if (response.IsSuccessStatusCode)
                    {
                        Task<string> t = response.Content.ReadAsStringAsync();
                        string s = t.Result;
                        string jsonNamespace = DeserializeObject<T>(s).ToString();
                        result = DeserializeObject<T>(s);
                    }
                    else
                    {
                        LogHelper.Warn("調用後臺服務返回失敗:" + url + Environment.NewLine + SerializeObject(response));
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("調用後臺服務出現異常!", ex);
            }
            return result;
        }

        /// <summary> 
        /// 對象轉JSON 
        /// </summary> 
        /// <param name="obj">對象</param> 
        /// <returns>JSON格式的字符串</returns> 
        public static string SerializeObject(object obj)
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();
            try
            {
                return jss.Serialize(obj);
            }
            catch (Exception ex)
            {
                LogHelper.Error("JSONHelper.SerializeObject 轉換對象失敗。", ex);
                throw new Exception("JSONHelper.SerializeObject(object obj): " + ex.Message);
            }
        }

        /// <summary>
        /// 將Json字符串轉換爲對像  
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="json"></param>
        /// <returns></returns>
        public static T DeserializeObject<T>(string json)
        {
            JavaScriptSerializer Serializer = new JavaScriptSerializer();
            T objs = default(T);
            try
            {
                objs = Serializer.Deserialize<T>(json);
            }
            catch (Exception ex)
            {
                LogHelper.Error("JSONHelper.DeserializeObject 轉換對象失敗。", ex);
                throw new Exception("JSONHelper.DeserializeObject<T>(string json): " + ex.Message);
            }
            return objs;

        }

        #endregion

        private static HttpResponseMessage HttpPost(string url, HttpContent httpContent)
        {
            HttpResponseMessage response = null;
            HttpClientHandler httpHandler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
            try
            {
                //using (HttpClient httpClient = new HttpClient(httpHandler))
                using (HttpClient httpClient = new HttpClient())
                {
                    httpClient.Timeout = new TimeSpan(0, 0, 5);
                    //異步Post
                    response = httpClient.PostAsync(url, httpContent).Result;
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("調用後臺服務出現異常!", ex);
            }
            return response;
        }

    }
}
View Code

 

下面再分享一個幫助類,有用到的作個參考吧post

using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace WebCollect.CommonHelp
{
    public static class CommonHelper
    {
        #region HttpClient
        private static HttpClient _httpClient;
        public static HttpClient httpClient
        {
            get
            {
                if (_httpClient == null)
                {
                    _httpClient = new HttpClient();
                    _httpClient.Timeout = new TimeSpan(0, 1, 0);

                }
                return _httpClient;
            }
            set { _httpClient = value; }
        }


        #endregion

        #region get請求
        /// <summary>
        /// get請求返回的字符串
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string GetRequestStr(string url)
        {
            try
            {
                var response = httpClient.GetAsync(new Uri(url)).Result;
                return response.Content.ReadAsStringAsync().Result;
            }
            catch (Exception)
            {
                return null;
            }
        }
        /// <summary>
        /// get請求返回的二進制
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static byte[] GetRequestByteArr(string url)
        {
            try
            {
                var response = httpClient.GetAsync(new Uri(url)).Result;
                return response.Content.ReadAsByteArrayAsync().Result;
            }
            catch (Exception)
            {
                return null;
            }
        }
        #endregion

        #region post請求
        /// <summary>
        /// post請求返回的字符串
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string PostRequestStr(string url)
        {
            try
            {
                string contentStr = "";
                StringContent sc = new StringContent(contentStr);
                sc.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");//todo
                var response = httpClient.PostAsync(new Uri(url), sc).Result;
                return response.Content.ReadAsStringAsync().Result;
            }
            catch (Exception)
            {
                return null;
            }
        }
        #endregion

    }
}
View Code
相關文章
相關標籤/搜索