新文章 网摘 文章 随笔 日记

WebApi调用封装

public class SimpleApiClient
    {
        public static HttpClient CreateHttpClient()
        {
            var handler = GetInsecureHandler();
            HttpClient httpClient = new HttpClient(handler);
            //{
            //    MaxResponseContentBufferSize = 256000
            //};
            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
            return httpClient;
        }

        public static async Task<T> PostAsync<T>(string url, object data) where T : class, new()
        {
            try
            {
                var client = CreateHttpClient();
                string content = JsonConvert.SerializeObject(data);
                var buffer = Encoding.UTF8.GetBytes(content);
                var byteContent = new ByteArrayContent(buffer);
                byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = await client.PostAsync(url, byteContent).ConfigureAwait(false);
                string result = await response.Content.ReadAsStringAsync();
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    throw new Exception($"GetAsync End, url:{url}, HttpStatusCode:{response.StatusCode}, result:{result}");
                }
                if (typeof(T) == typeof(string))
                {
                    return (T)(object)result;
                }

                return JsonConvert.DeserializeObject<T>(result);
            }
            catch (WebException ex)
            {
                if (ex.Response != null)
                {
                    string responseContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
                    throw new System.Exception($"response :{responseContent}", ex);
                }
                throw;
            }
        }


        public static async Task<T> GetAsync<T>(string url, object data)
        {
            try
            {
                string requestUrl = data == null ? url : $"{url}?{GetQueryString(data)}";
                var client = CreateHttpClient();
                var response = await client.GetAsync(requestUrl).ConfigureAwait(false);
                string content = await response.Content.ReadAsStringAsync();
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    throw new Exception($"GetAsync End, url:{url}, HttpStatusCode:{response.StatusCode}, result:{content}");
                }
                if (typeof(T) == typeof(string))
                {
                    return (T)(object)content;
                }
                var result = JsonConvert.DeserializeObject<T>(content);
                return result;
            }
            catch (WebException ex)
            {
                if (ex.Response != null)
                {
                    string responseContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
                    throw new Exception($"Response :{responseContent}", ex);
                }
                throw;
            }
        }

        private static string GetQueryString(object obj)
        {
            var properties = from p in obj.GetType().GetProperties()
                             where p.GetValue(obj, null) != null
                             select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString());

            return string.Join("&", properties.ToArray());
        }
        /// <summary>
        /// 如果是本地服务,不使用https
        /// </summary>
        /// <returns></returns>
        private static HttpClientHandler GetInsecureHandler()
        {
            var handler = new HttpClientHandler();
            handler.UseDefaultCredentials = true;
            //handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
            //{
            //    if (cert.Issuer.Equals("CN=localhost"))
            //        return true;
            //    return errors == System.Net.Security.SslPolicyErrors.None;
            //};
            return handler;
        }
    }

 改版后:

    public class SimpleApiClient
    {
        public static HttpClient CreateHttpClient(Dictionary<string, string> headers = null)
        {
            var handler = GetInsecureHandler();
            HttpClient httpClient = new HttpClient(handler);
            //{
            //    MaxResponseContentBufferSize = 256000
            //};
            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
            httpClient.Timeout = new TimeSpan(0, 0, 10, 0);

            if (headers != null)
            {
                foreach (var item in headers)
                {
                    httpClient.DefaultRequestHeaders.Add(item.Key, item.Value);
                }
            }

            return httpClient;
        }

        public static async Task PostAsync<T>(
            string url,
            object data,
            Dictionary<string, string> headers = null,
            Action<HttpResponseMessage> callBackAction = null) //where T : class, new()
        {
            try
            {
                var client = CreateHttpClient(headers);
                string content = JsonConvert.SerializeObject(data);
                var buffer = Encoding.UTF8.GetBytes(content);
                var byteContent = new ByteArrayContent(buffer);
                byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = await client.PostAsync(url, byteContent).ConfigureAwait(false);
                callBackAction?.Invoke(response);
            }
            catch (WebException ex)
            {
                if (ex.Response != null)
                {
                    string responseContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
                    throw new Exception($"response :{responseContent}", ex);
                }
                throw;
            }
        }
        public static async Task PutAsync<T>(
            string url,
            object data,
            Dictionary<string, string> headers = null,
            Action<HttpResponseMessage> callBackAction = null) //where T : class, new()
        {
            try
            {
                var client = CreateHttpClient(headers);
                string content = JsonConvert.SerializeObject(data);
                var buffer = Encoding.UTF8.GetBytes(content);
                var byteContent = new ByteArrayContent(buffer);
                byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = await client.PutAsync(url, byteContent).ConfigureAwait(false);

                callBackAction?.Invoke(response);
            }
            catch (WebException ex)
            {
                if (ex.Response != null)
                {
                    string responseContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
                    throw new Exception($"response :{responseContent}", ex);
                }
                throw;
            }
        }

        public static async Task GetAsync<T>(
            string url,
            object data,
            Dictionary<string, string> headers = null,
            Action<HttpResponseMessage> callBackAction = null)
        {
            try
            {
                string requestUrl = data == null ? url : $"{url}?{GetQueryString(data)}";
                var client = CreateHttpClient(headers);
                var response = await client.GetAsync(requestUrl).ConfigureAwait(false);
                callBackAction?.Invoke(response);
            }
            catch (WebException ex)
            {
                if (ex.Response != null)
                {
                    string responseContent = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
                    throw new Exception($"Response :{responseContent}", ex);
                }
                throw;
            }
        }
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="httpResponseMessage"></param>
        /// <returns></returns>
        public static async Task<T> DeserializeObject<T>(HttpResponseMessage httpResponseMessage)
        {
            string content = await httpResponseMessage.Content.ReadAsStringAsync();
            //如果是值類型,直接強制轉換
            var type = typeof(T);
            if (type.IsValueType)
            {
                return (T)Convert.ChangeType(content, type);
            }


            if (typeof(T) == typeof(string))
            {
                return (T)(object)content;
            }

            var result = JsonConvert.DeserializeObject<T>(content);
            return result;
        }

        private static string GetQueryString(object obj)
        {
            var properties = from p in obj.GetType().GetProperties()
                             where p.GetValue(obj, null) != null
                             select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString());

            return string.Join("&", properties.ToArray());
        }
        /// <summary>
        /// 如果是本地服务,不使用https
        /// </summary>
        /// <returns></returns>
        private static HttpClientHandler GetInsecureHandler()
        {
            var handler = new HttpClientHandler();
            handler.UseDefaultCredentials = true;
            //handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
            //{
            //    if (cert.Issuer.Equals("CN=localhost"))
            //        return true;
            //    return errors == System.Net.Security.SslPolicyErrors.None;
            //};
            return handler;
        }

        #region Test


        private static readonly string DefaultUserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36";

        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true; //总是接受   
        }

        public static HttpWebResponse PostHttps(string url, IDictionary<string, string> parameters, Encoding charset)
        {
            HttpWebRequest request = null;
            CookieContainer cookie = new CookieContainer();
            //HTTPSQ请求
            ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult;
            request = WebRequest.Create(url) as HttpWebRequest;
            request.Proxy = new WebProxy(new Uri("http://localhost:8888")); // port:8888就是Fiddler默认监听的端口
            request.CookieContainer = cookie;
            request.ProtocolVersion = HttpVersion.Version11;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.UserAgent = DefaultUserAgent;
            request.KeepAlive = true;
            request.Headers["Accept-Language"] = "zh-CN,zh;q=0.9";
            //request.Headers["Cookie"] = "username=aaaaaa; Language=zh_CN";
            //如果需要POST数据   
            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, WebUtility.UrlEncode(parameters[key]));
                    }
                    else
                    {
                        buffer.AppendFormat("{0}={1}", key, WebUtility.UrlEncode(parameters[key]));
                    }
                    i++;
                }
                byte[] data = charset.GetBytes(buffer.ToString());
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
            }

            return (HttpWebResponse)request.GetResponse();
        }


        public static void ApproveStart()
        {
            string url = "https://xxxx/v1/devices/02630000026238/xxxxx";
            Encoding encoding = Encoding.GetEncoding("utf-8");
            IDictionary<string, string> parameters = new Dictionary<string, string>();
            parameters.Add("xxx", "xxx");
            parameters.Add("xxx", "xxx");
            parameters.Add("xxx", "xxx");
            HttpWebResponse response = PostHttps(url, parameters, encoding);
            //打印返回值
            Stream stream = response.GetResponseStream();   //获取响应的字符串流
            StreamReader sr = new StreamReader(stream); //创建一个stream读取流
            string html = sr.ReadToEnd();   //从头读到尾,放到字符串html
            Console.WriteLine(html);
        }
        #endregion

    }


        public async void ShowResult(HttpResponseMessage response)
        {
            if (InvokeRequired)
            {
                BeginInvoke(new Action<HttpResponseMessage>(ShowResult), response);
                return;
            }
            TbxResult.Text = response.StatusCode.ToString();
            TbxResult.AppendText("\r\n");
            string result = await response.Content.ReadAsStringAsync();
            switch ((int)response.StatusCode)
            {
                case 200:
                    var obj = SimpleApiClient.DeserializeObject<object>(response).Result;
                    TbxResult.AppendText(obj?.ToString() ?? "");
                    break;
                default:
                    TbxResult.AppendText($@"HttpStatusCode: {response.StatusCode}, result: {result}");
                    break;
            }

        }


                var url = $@"{ConfigurationManager.AppSettings["ApiDomain"]}devices/{TbxSerialNumber.Text}/xxxx";
                await SimpleApiClient.PostAsync<object>(url, dto,null, _frmMain.ShowResult);

 

posted @ 2020-11-04 15:54  岭南春  阅读(225)  评论(0)    收藏  举报