0
点赞
收藏
分享

微信扫一扫

c#的WEBAPI请求HttpRequest工具类,含上传文件



 /// <summary>
        /// 
        /// desc:HttpRequest工具类
        /// auth:
        /// date:2022/9/21 9:41:05
        ///
        /// </summary>
        public static class HttpRequestTools
        {

            /// <summary>
            /// HTTP表单(Form)提交数据(含上传文件)
            /// </summary>
            /// <param name="url"></param>
            /// <param name="postData"></param>
            /// <param name="files"></param>
            /// <param name="timeOut"></param>
            /// <param name="headers"></param>
            /// <returns></returns>
            public static string HttpPostForm(string url, Dictionary<string, string> postData = null, Dictionary<string, byte[]> files = null, int timeOut = 120, Dictionary<string, string> headers = null)
            {
                // HTTP请求 会携带很多头部数据,以及body数据。头部数据量小,body数据量大,附件这种一般都是放body里。
                // 以字节流的形式放在stream里,随着请求一起发出去!!(理解不一定对,但大致应该是这样的),你给别人发消息
                postData = postData ?? null;
                ServicePointManager.DefaultConnectionLimit = 512;
                var request = WebRequest.Create(url) as HttpWebRequest;
                string boundary = "----WebKitFormBoundary" + 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");

                request.ContentType = "multipart/form-data;boundary=" + boundary;
                request.Timeout = timeOut * 1000;
                if (headers != null)
                {
                    foreach (var header in headers)
                        request.Headers.Add(header.Key, header.Value);
                }
                request.Method = "POST";

                string postdata = JHNIS.JHNISCommonLib.CommonHelper.SerializeConverter.SerializeObjectToJson(postData);
                byte[] data = Encoding.UTF8.GetBytes(postdata);

                using (Stream stream = request.GetRequestStream())
                {
                    //stream.Write(data, 0, data.Length);
                    //1.1 key/value
                    string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
                    foreach (var item in postData)
                    {
                        stream.Write(boundarybytes, 0, boundarybytes.Length);
                        string formitem = string.Format(formdataTemplate, item.Key, item.Value);
                        byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
                        stream.Write(formitembytes, 0, formitembytes.Length);
                    }

                    //1.2 file
                    if (files != null)
                    {
                        // 有附件则上传
                        foreach (var file in files)
                        {
                            stream.Write(boundarybytes, 0, boundarybytes.Length);
                            string temp = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\r\n\r\n";
                            string header = string.Format(temp, "file", file.Key);
                            byte[] fileName = Encoding.UTF8.GetBytes(header);
                            stream.Write(fileName, 0, fileName.Length);
                            stream.Write(file.Value, 0, file.Value.Length);
                        }
                    }
                    //1.3 form end
                    stream.Write(endbytes, 0, endbytes.Length);
                }


                // HTTP响应,也就是你给别人发的消息,别人看到了,给你回消息

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                using (var httpStreamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
                {
                    return httpStreamReader.ReadToEnd();
                }
            }


            /// <summary>
            /// 指定Post地址获取全部字符串
            /// </summary>
            /// <param name="url">请求后台地址</param>
            /// <param name="dic">请求数据集合</param>
            /// <returns></returns>
            public static string HttpPost(string url, Dictionary<string, string> dic)
            {
                string result = string.Empty;
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.Method = "POST";
                req.ContentType = "application/json";
                req.UserAgent = "Apifox/1.0.0 (https://www.apifox.cn)";

                #region 添加Post 参数
                StringBuilder builder = new StringBuilder();
                int i = 0;
                foreach (var item in dic)
                {
                    if (i > 0)
                        builder.Append("&");
                    builder.AppendFormat("{0}={1}", item.Key, item.Value);
                    i++;
                }
                byte[] data = Encoding.UTF8.GetBytes(builder.ToString());
                req.ContentLength = data.Length;
                using (Stream reqStream = req.GetRequestStream())
                {
                    reqStream.Write(data, 0, data.Length);
                    reqStream.Close();
                }
                #endregion

                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream stream = resp.GetResponseStream();
                //获取响应内容
                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                {
                    result = reader.ReadToEnd();
                }
                return result;
            }


            /// <summary>
            /// 指定Post地址获取全部字符串
            /// </summary>
            /// <param name="url">请求后台地址</param>
            /// <param name="dic">请求数据集合</param>
            /// <returns></returns>
            public static string HttpPostBody(string url, string body)
            {
                string result = string.Empty;
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.Method = "POST";
                req.ContentType = "application/json";
                req.UserAgent = "Apifox/1.0.0 (https://www.apifox.cn)";

                #region 添加Post 参数
                StringBuilder builder = new StringBuilder();
                int i = 0;

                byte[] data = Encoding.UTF8.GetBytes(body);
                req.ContentLength = data.Length;
                using (Stream reqStream = req.GetRequestStream())
                {
                    reqStream.Write(data, 0, data.Length);
                    reqStream.Close();
                }
                #endregion

                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream stream = resp.GetResponseStream();
                //获取响应内容
                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                {
                    result = reader.ReadToEnd();
                }
                return result;
            }

            /// <summary>
            /// 使用Get 方式获取全部字符串
            /// </summary>
            /// <param name="url">请求后台地址</param>
            /// <param name="dic">请求数据集合</param>
            /// <returns></returns>
            public static string HttpGet(string url, Dictionary<string, string> dic)
            {
                string result = string.Empty;
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.Method = "GET";
                req.ContentType = "application/json";

                #region 添加Post 参数
                StringBuilder builder = new StringBuilder();
                int i = 0;
                foreach (var item in dic)
                {
                    if (i > 0)
                        builder.Append("&");
                    builder.AppendFormat("{0}={1}", item.Key, item.Value);
                    i++;
                }
                byte[] data = Encoding.UTF8.GetBytes(builder.ToString());
                req.ContentLength = data.Length;
                using (Stream reqStream = req.GetRequestStream())
                {
                    reqStream.Write(data, 0, data.Length);
                    reqStream.Close();
                }
                #endregion

                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream stream = resp.GetResponseStream();
                //获取响应内容
                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                {
                    result = reader.ReadToEnd();
                }
                return result;
            }

        /// <summary>
        /// 使用Get 方式获取全部字符串
        /// </summary>
        /// <param name="url">请求后台地址</param>
        /// <param name="dic">请求数据集合</param>
        /// <returns></returns>
        public static byte[] HttpGetFile(string url)
        {
            try
            {
                WebClient cl = new WebClient();

                var data = cl.DownloadData(url);

                return data;
            }
            catch(Exception ex) 
            {
                Log.SaveExceptionLog("下载失败:" + url, ex);
                return null;
            }
            
        }

举报

相关推荐

0 条评论