C# HttpWebRequest\HttpWebResponse\WebClient发送请求解析json数据 gzip压缩

在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求
在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求 6.0

HttpWebRequest【.NET早期版本,同步方式】
WebClient【HttpWebRequest的封装简化版,同步方式】
HttpClient    【.NET4.5以后,异步方式】
HttpClientFactory【.NET Core2.1】

获取当前时间、获取 WebHeaderCollection 参数

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

//方式一:获取当前时间
var lastModified = response.LastModified;
WebHeaderCollection headerCollection = response.Headers;
foreach (var h in headerCollection.AllKeys)
{
    if (h == "Date")
    {
        //方式二:获取当前时间
        var datetime = headerCollection[h];
        DateTime time = GMT2Local(headerCollection[h]);
    }
}

/// <summary>
/// GMT时间转成本地时间
/// Fri, 18 Mar 2022 13:55:32 GMT
/// </summary>
/// <param name="gmt">字符串形式的GMT时间</param>
/// <returns></returns>
public DateTime GMT2Local(string gmt)
{
    DateTime dt = DateTime.MinValue;
    try
    {
        string pattern = "";
        if (gmt.IndexOf("+0") != -1)
        {
            gmt = gmt.Replace("GMT", "");
            pattern = "ddd, dd MMM yyyy HH':'mm':'ss zzz";
        }
        if (gmt.ToUpper().IndexOf("GMT") != -1)
        {
            pattern = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'";
        }
        if (pattern != "")
        {
            dt = DateTime.ParseExact(gmt, pattern, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
            dt = dt.ToLocalTime();
        }
        else
        {
            dt = Convert.ToDateTime(gmt);
        }
    }
    catch
    {
    }
    return dt;
}

*

/// <summary>
/// 日期:2016-2-4
/// 备注:bug已修改,可以使用
/// </summary>
public static void Method1()
{
    try
    {
        string domain = "http://192.168.1.6:8098/";
        string url = domain + "/Signin/LoginApi";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        //request.ContentType = "application/json";
        request.ReadWriteTimeout = 30 * 1000;

        // 忽略证书
        request.ServerCertificateValidationCallback = (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => {
            return true;
        };

        ///添加参数
        Dictionary<String, String> dicList = new Dictionary<String, String>();
        dicList.Add("UserName", "test@qq.com");
        dicList.Add("Password", "000000");
        String postStr = buildQueryStr(dicList);
        byte[] data = Encoding.UTF8.GetBytes(postStr);

        request.ContentLength = data.Length;

        Stream myRequestStream = request.GetRequestStream();
        myRequestStream.Write(data, 0, data.Length);
        myRequestStream.Close();

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        //当前时间
        var lastModified = response.LastModified;
        WebHeaderCollection headerCollection = response.Headers;
        foreach (var h in headerCollection.AllKeys)
        {
            if (h == "Date")
            {
                var datetime = headerCollection[h];
                DateTime time = GMT2Local(headerCollection[h]);
            }
        }

        StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
        var retString = myStreamReader.ReadToEnd();
        myStreamReader.Close();
    }
    catch (Exception ex)
    {
        log.Info("Entered ItemHierarchyController - Initialize");
        log.Error(ex.Message);
    }
}

/// <summary>
/// GMT时间转成本地时间
/// Fri, 18 Mar 2022 13:55:32 GMT
/// </summary>
/// <param name="gmt">字符串形式的GMT时间</param>
/// <returns></returns>
public DateTime GMT2Local(string gmt)
{
    DateTime dt = DateTime.MinValue;
    try
    {
        string pattern = "";
        if (gmt.IndexOf("+0") != -1)
        {
            gmt = gmt.Replace("GMT", "");
            pattern = "ddd, dd MMM yyyy HH':'mm':'ss zzz";
        }
        if (gmt.ToUpper().IndexOf("GMT") != -1)
        {
            pattern = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'";
        }
        if (pattern != "")
        {
            dt = DateTime.ParseExact(gmt, pattern, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
            dt = dt.ToLocalTime();
        }
        else
        {
            dt = Convert.ToDateTime(gmt);
        }
    }
    catch
    {
    }
    return dt;
}

升级版本,提取到帮助类,封装对象,gzip压缩

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

namespace CMS.Common
{
    public class MyHttpClient
    {
        public string methodUrl = string.Empty;
        public string postStr = null;

        public MyHttpClient(String methodUrl)
        {
            this.methodUrl = methodUrl;
        }

        public MyHttpClient(String methodUrl, String postStr)
        {
            ///this.methodUrl = ConfigurationManager.AppSettings["ApiFrontEnd"];///http://192.168.1.6:8098/Signin/LoginApi
            ///this.postStr = postStr;

            this.methodUrl = methodUrl;
            this.postStr = postStr;
        }

        /// <summary>
        /// GET Method
        /// </summary>
        /// <returns></returns>
        public String ExecuteGet()
        {
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(this.methodUrl);
            myRequest.Method = "GET";
            myRequest.Headers.Add("Accept-Encoding", "gzip, deflate, br");

            // 忽略证书
            myRequest.ServerCertificateValidationCallback = (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => {
                return true;
            };

            HttpWebResponse myResponse = null;
            try
            {
                myResponse = (HttpWebResponse)myRequest.GetResponse();
                StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                StreamReader reader = new StreamReader(new GZipStream(myResponse.GetResponseStream(), CompressionMode.Decompress), Encoding.GetEncoding("utf-8"));
                string content = reader.ReadToEnd();
                return content;
            }
            //异常请求
            catch (WebException e)
            {
                myResponse = (HttpWebResponse)e.Response;
                using (Stream errData = myResponse.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(errData))
                    {
                        string text = reader.ReadToEnd();

                        return text;
                    }
                }
            }
        }

        /// <summary>
        /// POST Method
        /// </summary>
        /// <returns></returns>
        public string ExecutePost()
        {
            string content = string.Empty;

            Random rd = new Random();
            int rd_i = rd.Next();
            String nonce = Convert.ToString(rd_i);
            String timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now));
            String signature = GetHash(this.appSecret + nonce + timestamp);

            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.methodUrl);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                //request.ContentType = "application/json";
                request.Headers.Add("Nonce", nonce);
                request.Headers.Add("Timestamp", Convert.ToString(StringProc.ConvertDateTimeInt(DateTime.Now)));
                request.Headers.Add("Signature", signature);
                request.ReadWriteTimeout = 30 * 1000;

                // 忽略证书
                request.ServerCertificateValidationCallback = (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => {
                    return true;
                };

                byte[] data = Encoding.UTF8.GetBytes(postStr);
                request.ContentLength = data.Length;

                Stream myRequestStream = request.GetRequestStream();

                myRequestStream.Write(data, 0, data.Length);
                myRequestStream.Close();

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                StreamReader myStreamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                content = myStreamReader.ReadToEnd();
                myStreamReader.Close();
            }
            catch (Exception ex)
            {
            }
            return content;
        }

        /// <summary>
        /// POST Method 调用示例
        /// Dictionary<string, string> parm = new Dictionary<string, string>();
        /// parm.Add("user_name", "admin");
        /// parm.Add("password", "123456");
        /// var result = ExecutePost("http://******:9000/api/v1/passport/login", JsonConvert.SerializeObject(parm));
        /// </summary>
        /// <returns></returns>
        public string ExecutePost(string url, string data)
        {
            byte[] buffer = Encoding.UTF8.GetBytes(data);
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
            myRequest.Method = "POST";
            myRequest.ContentType = "application/json";
            myRequest.ContentLength = buffer.Length;

            // 忽略证书
            myRequest.ServerCertificateValidationCallback = (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => {
                return true;
            };

            Stream newStream = myRequest.GetRequestStream();
            newStream.Write(buffer, 0, buffer.Length);
            newStream.Close();
            HttpWebResponse myResponse = null;
            try
            {
                myResponse = (HttpWebResponse)myRequest.GetResponse();
                StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                string content = reader.ReadToEnd();
                return content;
            }
            //异常请求
            catch (WebException e)
            {
                myResponse = (HttpWebResponse)e.Response;
                using (Stream errData = myResponse.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(errData))
                    {
                        string text = reader.ReadToEnd();
                        LogUtils.GetInstance().Info($"Ln 152 {text}");
                        return text;
                    }
                }
            }
        }
    }

    public class StringProc
    {
        public static String buildQueryStr(Dictionary<String, String> dicList)
        {
            String postStr = "";

            foreach (var item in dicList)
            {
                postStr += item.Key + "=" + HttpUtility.UrlEncode(item.Value, Encoding.UTF8) + "&";
            }
            postStr = postStr.Substring(0, postStr.LastIndexOf('&'));
            return postStr;
        }

        public static int ConvertDateTimeInt(System.DateTime time)
        {
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
            return (int)(time - startTime).TotalSeconds;
        }
    }
}

前端调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CMS.Common;
using Newtonsoft.Json;

namespace Medicine.Web.Controllers
{
    public class DefaultController : Controller
    {
        public ActionResult Index()
        {
            #region DoGet

            string getResultJson = this.DoGet(url);
            HttpClientResult customerResult = (HttpClientResult)JsonConvert.DeserializeObject(getResultJson, typeof(HttpClientResult));

            #endregion

            #region DoPost

            string name = Request.Form["UserName"];
            string password = Request.Form["Password"];

            Dictionary<String, String> dicList = new Dictionary<String, String>();
            dicList.Add("UserName", name);
            dicList.Add("Password", password);
            string postStr = StringProc.buildQueryStr(dicList);

            string postResultJson = this.DoPost(url, postStr);
            HttpClientResult userResult = (HttpClientResult)JsonConvert.DeserializeObject(postResultJson, typeof(HttpClientResult));

            #endregion

            return View();
        }

        /// <summary>
        /// GET Method
        /// </summary>
        /// <param name="portraitUri">url地址</param>
        /// <returns></returns>
        private String DoGet(string portraitUri)
        {
            MyHttpClient client = new MyHttpClient(portraitUri);
            return client.ExecuteGet();
        }

        /// <summary>
        /// POST Method
        /// </summary>
        /// <param name="portraitUri">url地址</param>
        /// <param name="postStr">请求参数</param>
        /// <returns></returns>
        private String DoPost(string portraitUri, string postStr)
        {
            MyHttpClient client = new MyHttpClient(portraitUri, postStr);
            return client.ExecutePost();
        }

        public class HttpClientResult
        {
            public string UserName { get; set; }

            public bool Success { get; set; }
        }
    }
}

HttpClient

var responseString = string.Empty;
using (var client = new HttpClient())
{
    var values = new Dictionary<string, string>
    {
        { "apikey", apiKey },
        { "mobile", phoneNumber },
        { "text", smsMessage }
    };
    
    var content = new FormUrlEncodedContent(values);
    var response = await client.PostAsync(url, content);
    responseString = await response.Content.ReadAsStringAsync();
}

.net framework 3.5 版本,遇见“基础连接已关闭”的问题,尝试如下方法:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)768;

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

微软官方文档说明:SecurityProtocolType 枚举 (System.Net) | Microsoft Docs

忽略证书
myRequest.ServerCertificateValidationCallback = (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => {
    return true;
}

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值