HTTP工具

HTTP工具类,重构封装了常用的3种协议:json、x-www-form-urlencoded、multipart/form-data支持文件上传。

   public class Http
    {
        public static string Get(string endPoint, Dictionary<string, object> heads = null, int timeout = 15000)
        {
            var request = GetRequest(endPoint, heads, timeout);
            request.Method = "GET";
            request.ContentType = "text/plain; charset=UTF-8";

            return GetResponseValue(request);
        }

        public static string PostJson(string endPoint, string json, Dictionary<string, object> heads = null, int timeout = 15000)
        {
            var request = GetRequest(endPoint, heads, timeout);
            request.ContentType = "application/json; charset=UTF-8";

            var bytes = Encoding.UTF8.GetBytes(json);
            request.ContentLength = bytes.Length;
            using (var writeStream = request.GetRequestStream())
            {
                writeStream.Write(bytes, 0, bytes.Length);
            }

            return GetResponseValue(request);
        }

        public static string PostFormUrlEncoded(string endPoint, Dictionary<string, object> data, Dictionary<string, object> heads = null, int timeout = 15000)
        {
            var request = GetRequest(endPoint, heads, timeout);
            request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";

            string postData = "";
            foreach (var item in data)
            {
                postData += $"{item.Key}={item.Value}&";
            }
            postData = postData.TrimEnd('&');

            var bytes = Encoding.UTF8.GetBytes(postData);
            request.ContentLength = bytes.Length;
            using (var writeStream = request.GetRequestStream())
            {
                writeStream.Write(bytes, 0, bytes.Length);
            }

            return GetResponseValue(request);
        }

        public static string PostFormData(string endPoint, 
            Dictionary<string, object> data, 
            Dictionary<string, object> heads = null, 
            Dictionary<string, KeyValuePair<string, byte[]>> files = null, 
            int timeout = 15000)
        {
            var request = GetRequest(endPoint, heads, timeout);
            var boundary = "----WebKitFormBoundary" + DateTime.Now.Ticks.ToString("X");
            request.ContentType = $"multipart/form-data; charset=UTF-8; boundary={boundary}";
            
            MemoryStream memoryStream = new MemoryStream();

            #region 添加普通表单

            if (data != null)
            {
                // 添加非文件类型的字节流
                StringBuilder postData = new StringBuilder("");
                foreach (var item in data)
                {
                    postData.AppendLine($"--{boundary}");
                    postData.AppendLine($"Content-Disposition: form-data; name=\"{item.Key}\"{Environment.NewLine}");
                    postData.AppendLine(item.Value + "");
                }
                var bytes = Encoding.UTF8.GetBytes(postData.ToString());
                memoryStream.Write(bytes, 0, bytes.Length);
            }

            #endregion

            #region 添加文件表单

            if (files != null)
            {
                byte[] newLineBytes = Encoding.UTF8.GetBytes(Environment.NewLine);
                // 添加文件字节流
                foreach (var file in files)
                {
                    StringBuilder fileData = new StringBuilder("");
                    fileData.AppendLine($"--{boundary}");
                    fileData.AppendLine($"Content-Disposition: form-data; name=\"{file.Key}\"; filename=\"{file.Value.Key}\"");
                    fileData.AppendLine($"Content-Type: application/octet-stream{Environment.NewLine}");

                    var bytes = Encoding.UTF8.GetBytes(fileData.ToString());
                    memoryStream.Write(bytes, 0, bytes.Length);
                    memoryStream.Write(file.Value.Value, 0, file.Value.Value.Length);
                    memoryStream.Write(newLineBytes, 0, newLineBytes.Length);
                }
            }

            #endregion

            #region 添加结尾标记

            var endBytes = Encoding.UTF8.GetBytes($"--{boundary}--");
            memoryStream.Write(endBytes, 0, endBytes.Length);

            #endregion

            var totalBytes = memoryStream.ToArray();
            memoryStream.Close();
            request.ContentLength = totalBytes.Length;
            using (var writeStream = request.GetRequestStream())
            {
                writeStream.Write(totalBytes, 0, totalBytes.Length);
            }

            return GetResponseValue(request);
        }

        protected static HttpWebRequest GetRequest(string endPointWithParams, Dictionary<string, object> heads = null, int timeout = 15000)
        {
            var service = new Uri(endPointWithParams);
            var request = WebRequest.CreateHttp(service);
            request.Method = "POST";
            request.Timeout = timeout;
            request.ContinueTimeout = timeout;
            request.KeepAlive = true;
            request.ContentLength = 0;

            if (heads != null)
            {
                foreach (var head in heads)
                {
                    if (request.Headers.AllKeys.Contains(head.Key))
                        request.Headers[head.Key] = head.Value + "";
                    else request.Headers.Add(head.Key, head.Value + "");
                }
            }
            return request;
        }

        protected static string GetResponseValue(HttpWebRequest request)
        {
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                var responseValue = string.Empty;
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    var message = string.Format(CultureInfo.CurrentCulture, "Request failed. Received HTTP {0}",
                        response.StatusCode);
                    throw new WebException(message);
                }

                using (var responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                        using (var reader = new StreamReader(responseStream))
                        {
                            responseValue = reader.ReadToEnd();
                        }
                }

                return responseValue;
            }
        }

    }

 

调用方式:

var url = "http://localhost:50752/home/test";

            var heads = new Dictionary<string, object>();
            heads.Add("token", "0000000000000000000000");

            var jsonDic = new Dictionary<string, object>();
            jsonDic.Add("id", 100);
            jsonDic.Add("name", "上海市");
            jsonDic.Add("level", 987.03);
            var jsonResult = Http.PostJson(url, jsonDic.ToJson(), heads);

            var postFormUrlEncoded = Http.PostFormUrlEncoded(url, jsonDic, heads);

            var filepath = "F:\\008-Word\\2017.10.30.pdf";
            var bytes = File.ReadAllBytes(filepath);
            var fileInfo = new FileInfo(filepath);
            var files = new Dictionary<string, KeyValuePair<string, byte[]>>();
            files.Add("fil", new KeyValuePair<string, byte[]>(fileInfo.Name, bytes));
            files.Add("ni", new KeyValuePair<string, byte[]>(fileInfo.Name, bytes));
            var postFormData = Http.PostFormData(url, jsonDic, heads, files);

            Console.ReadLine();
上一篇:【Vulhub】Rsync未授权访问漏洞复现


下一篇:Linux入门训练二