httpclint的传值和访问https

一、StringContent与FormUrlEncodedContent

可参考这篇文章写的非常好: https://blog.csdn.net/lxrj2008/article/details/77840453

本文是一个很另类的文章,在项目中用的比较少,但如果项目中真的出现了这种情况,我们也需要知道如何去解决,对于知识点StringContent和FormUrlEncodedContent我们应该了解的多一点,FormUrlEncodedContent是以键/值对的形式进行POST数据的提供,同时要求服务端以x-www-form-urlencoded的方式去接收数据!而StringContent是ByteArrayContent的一个子集,也是MultipartFormDataContent的一个子集,在进行大数据传输时,我们需要使用这种方法,如果传递的是字符串,可以采用StringContent,如果是二进制流,可以使用ByteArrayContent,而这两种方式都可以对外以MultipartFormDataContent的形式体现,而在服务端要以mutipart/form-data的方式来接收数据!

 

 

二、请求https(httpclient)

        private static HttpClient client => GetHttpClient();  


        /// <summary>
        /// 获取HttpClient实例
        /// </summary>
        /// <returns></returns>
        private static HttpClient GetHttpClient()
        {
            if (JSONURL_RYW.StartsWith("https://")) return new HttpClient(GetHttpClientHandler(true));

            return new HttpClient();
        }
        /// <summary>
        /// 获取HttpClientHandler对象实例
        /// </summary>
        /// <param name="ishttps">是否https</param>
        /// <returns></returns>
        private static HttpClientHandler GetHttpClientHandler(bool ishttps)
        {
            var handler = new HttpClientHandler()
            {
                ClientCertificateOptions = ClientCertificateOption.Automatic,
                ServerCertificateCustomValidationCallback = (message, cer, chain, errors) => true
            };
            if (ishttps) return handler;
            return null;
        }

三、httpwebrequest

public static async Task<string> PostApiControllerAsync(string url, string body)
        {
            if (url.StartsWith("https://"))
            {
                ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
            }
            Encoding encoding = Encoding.UTF8;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.Accept = "text/html, application/xhtml+xml, */*";
            request.ContentType = "application/json";
            var hc = IOC.GetServer<IHttpContextAccessor>();
            if (hc == null) { throw new Exception("无上下文环境"); }
            request.Headers.Add("Authorization", hc.HttpContext.Request.Headers["Authorization"].ToStringWithDefault());
            request.Headers.Add("Authorization_DSST", hc.HttpContext.Request.Headers["Authorization_DSST"].ToStringWithDefault());
            byte[] buffer = encoding.GetBytes(body);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                return await reader.ReadToEndAsync();
            }
        }
        public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            //直接确认,否则打不开
            return true;
        }

 四、https访问模型(图片来源于网络)

五、传值

 //增加头部

httpClient.DefaultRequestHeaders.Add("head", "test");

//添加认证

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token)

//表单传值

var fromContent = new FormUrlEncodedContent(new[]
{
     new KeyValuePair<string,string>("test","test")
});

//表单传值 Dictionary<string, string> keyValuePairs)

public static async Task<string> PostOtherSysAsync(string url, Dictionary<string, string> keyValuePairs)
{
   var formParam = new FormUrlEncodedContent(keyValuePairs);//表单类型

   HttpResponseMessage response = await client.PostAsync(new Uri(url), formParam);
   response.EnsureSuccessStatusCode();
   string responseBody = await response.Content.ReadAsStringAsync();
   return responseBody;
}

//body传值,一般就是json或者text/html 、application/javascript 、text/plain、 application/xml这种传输格式的,这种都要指定ContentType

var jsonContent = new StringContent(json);
jsonContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");

  

posted @ 2022-05-18 12:00  海爬sir  阅读(263)  评论(0)    收藏  举报