C#调用HttpWebRequest请求的两种方式,application/json和multipart/form-data

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace Huinaozn.ASleepPC.Tools.Utils
{
    public static class HttpWebResponseUtility
    {
        /// <summary>
        /// 通用请求方法
        /// </summary>
        /// <param name="url"></param>
        /// <param name="datas"></param>
        /// <param name="method">POST GET PUT DELETE</param>
        /// <param name="contentType">"POST application/x-www-form-urlencoded; charset=UTF-8"</param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static string HttpRequest(string url, string data, string method = "POST", string contentType = "application/json", Encoding encoding = null, string token = null)
        {
            if (encoding == null)
                encoding = Encoding.UTF8;
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Method = method;
            request.Timeout = 150000;
            request.AllowAutoRedirect = false;

            //添加头部Authorization验证token
            if (token != null)
            {
                request.Headers.Add("Authorization", token);
            }
            if (!string.IsNullOrEmpty(contentType))
            {
                request.ContentType = contentType;
            }
            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            }
            Stream requestStream = null;
            string responseStr = null;
            try
            {
                if (data != null)
                {
                    byte[] datas = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);//data可以直接传字节类型 byte[] data,然后这一段就可以去掉
                    request.ContentLength = datas.Length;
                    requestStream = request.GetRequestStream();
                    requestStream.Write(datas, 0, datas.Length);
                    requestStream.Close();
                }
                else
                {
                    request.ContentLength = 0;
                }
                using (HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse())
                {
                    Stream getStream = webResponse.GetResponseStream();
                    byte[] outBytes = ReadFully(getStream);
                    getStream.Close();
                    responseStr = Encoding.UTF8.GetString(outBytes);
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                request = null;
                requestStream = null;
            }
            return responseStr;
        }

        public static string HttpRequest(string url, string data, string userName, string password, string method = "POST", string contentType = "application/json", Encoding encoding = null, string token = null)
        {
            if (encoding == null)
                encoding = Encoding.UTF8;
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Method = method;
            request.Timeout = 150000;
            request.AllowAutoRedirect = false;

            CredentialCache credentialCache = new CredentialCache();
            credentialCache.Add(new Uri(url), "Basic", new NetworkCredential(userName, password));
            request.Credentials = credentialCache;

            //添加头部Authorization验证token
            if (token != null)
            {
                request.Headers.Add("Authorization", token);
            }
            if (!string.IsNullOrEmpty(contentType))
            {
                request.ContentType = contentType;
            }
            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            }
            Stream requestStream = null;
            string responseStr = null;
            try
            {
                if (data != null)
                {
                    byte[] datas = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);//data可以直接传字节类型 byte[] data,然后这一段就可以去掉
                    request.ContentLength = datas.Length;
                    requestStream = request.GetRequestStream();
                    requestStream.Write(datas, 0, datas.Length);
                    requestStream.Close();
                }
                else
                {
                    request.ContentLength = 0;
                }
                using (HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse())
                {
                    Stream getStream = webResponse.GetResponseStream();
                    byte[] outBytes = ReadFully(getStream);
                    getStream.Close();
                    responseStr = Encoding.UTF8.GetString(outBytes);
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                request = null;
                requestStream = null;
            }
            return responseStr;
        }
        /// <summary>
        /// HTTP请求(包含多分部数据,multipart/form-data)。
        /// 将多个文件以及多个参数以多分部数据表单方式上传到指定url的服务器
        /// </summary>
        /// <param name="url">请求目标URL</param>
        /// <param name="fileFullNames">待上传的文件列表(包含全路径的完全限定名)。如果某个文件不存在,则忽略不上传</param>
        /// <param name="kVDatas">请求时表单键值对数据。</param>
        /// <param name="method">请求的方法。请使用 WebRequestMethods.Http 的枚举值</param>
        /// <param name="timeOut">获取或设置 <see cref="M:System.Net.HttpWebRequest.GetResponse" />///      <see cref="M:System.Net.HttpWebRequest.GetRequestStream" /> 方法的超时值(以毫秒为单位)。
        ///      -1 表示永不超时
        /// </param>
        /// <returns></returns>
        public static string HttpPost(string url, string fileFullNames, NameValueCollection kVDatas = null, string method = WebRequestMethods.Http.Post, int timeOut = -1)
        {
            try
            {
                string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
                byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
                byte[] endbytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");

                //1.HttpWebRequest
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.ContentType = "multipart/form-data; boundary=" + boundary;
                request.Method = "POST";
                request.KeepAlive = true;
                request.Timeout = timeOut;

                CredentialCache credentialCache = new CredentialCache();
                credentialCache.Add(new Uri(url), "Basic", new NetworkCredential("member", "secret"));
                request.Credentials = credentialCache;

                request.ServicePoint.Expect100Continue = false;
                using (Stream stream = request.GetRequestStream())
                {
                    //1.1 key/value
                    string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
                    if (kVDatas != null)
                    {
                        foreach (string key in kVDatas.Keys)
                        {
                            stream.Write(boundarybytes, 0, boundarybytes.Length);
                            string formitem = string.Format(formdataTemplate, key, kVDatas[key]);
                            byte[] formitembytes = Encoding.GetEncoding("UTF-8").GetBytes(formitem);
                            stream.Write(formitembytes, 0, formitembytes.Length);
                        }
                    }
                    stream.Write(endbytes, 0, endbytes.Length);
                }
                //2.WebResponse
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                using (StreamReader stream = new StreamReader(response.GetResponseStream()))
                {
                    return stream.ReadToEnd();
                }

            }
            catch (Exception e)
            {

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

        public static byte[] ReadFully(Stream stream)
        {
            byte[] buffer = new byte[512];
            using (MemoryStream ms = new MemoryStream())
            {
                while (true)
                {
                    int read = stream.Read(buffer, 0, buffer.Length);
                    if (read <= 0)
                        return ms.ToArray();
                    ms.Write(buffer, 0, read);
                }
            }
        }
    }
}

 

posted @ 2021-01-26 08:53  春江花月夜、  阅读(3278)  评论(0编辑  收藏  举报