zoukankan      html  css  js  c++  java
  • C# 模拟HTTP请求 GET POST + 文件上传

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using System.Net.Security;
    using System.Security.Cryptography.X509Certificates;
    using System.Text;
    using System.Web;
    using System.Windows.Forms;
    
    namespace CadCoreApp
    {
        public static class HttpHelper
        {
    
            /// <summary>
            /// http/https请求响应
            /// </summary>
            /// <param name="getOrPost"></param>
            /// <param name="url">地址(要带上http或https)</param>
            /// <param name="headers">请求头</param>
            /// <param name="parameters">提交数据</param>
            /// <param name="dataEncoding">编码类型 utf-8</param>
            /// <param name="contentType">application/x-www-form-urlencoded</param>
            /// <returns></returns>
            public static HttpWebResponse HttpRequest(
                string getOrPost,
                string url,
                Dictionary<string, string> headers,
                Dictionary<string, string> parameters,
                Encoding dataEncoding,
                string contentType
                )
            {
                var request = CreateRequest(getOrPost, url, headers, parameters, dataEncoding, contentType);
    
                //如果需要POST数据  
                if (getOrPost == "POST" && !(parameters == null || parameters.Count == 0))
                {
                    var data = FormatPostParameters(parameters, dataEncoding, contentType);
    
                    using (Stream stream = request.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                        stream.Close();
                    }
                }
    
                WebResponse Res = null;
                try
                {
                    Res = request.GetResponse();
                }
                catch (WebException ex)
                {
                    Res = (HttpWebResponse)ex.Response;
                }
                catch (Exception e)
                {
                    throw e;
                }
    
                if (null == Res)
                {
                    return request.GetResponse() as HttpWebResponse;
                }
    
                return (HttpWebResponse)Res;
            }
    
    
            /// <summary>
            /// 创建HTTP请求对象
            /// </summary>
            /// <param name="getOrPost"></param>
            /// <param name="url"></param>
            /// <param name="headers"></param>
            /// <param name="parameters"></param>
            /// <param name="paraEncoding"></param>
            /// <param name="contentType"></param>
            /// <returns></returns>
            private static HttpWebRequest CreateRequest(
                string getOrPost
                , string url
                , Dictionary<string, string> headers
                , Dictionary<string, string> parameters
                , Encoding paraEncoding
                , string contentType
                )
            {
                if (string.IsNullOrEmpty(url))
                {
                    throw new ArgumentNullException("url");
                }
    
                if (parameters != null && parameters.Count > 0 && paraEncoding == null)
                {
                    throw new ArgumentNullException("requestEncoding");
                }
    
                HttpWebRequest request = null;
                //判断是否是https  
                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback =
                        new RemoteCertificateValidationCallback(CheckValidationResult);
                    request = WebRequest.Create(url) as HttpWebRequest;
                    request.ProtocolVersion = HttpVersion.Version10;
                }
                else
                {
                    request = WebRequest.Create(url) as HttpWebRequest;
                }
    
                if (getOrPost == "GET")
                {
                    request.Method = "GET";
    
                    if (parameters != null && parameters.Count > 0)
                    {
                        url = FormatGetParametersToUrl(url, parameters, paraEncoding);
                    }
                }
                else
                {
                    request.Method = "POST";
                }
    
                if (contentType == null)
                {
                    request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
                }
                else
                {
                    request.ContentType = contentType;
                }
    
                //POST的数据大于1024字节的时候,如果不设置会分两步
                request.ServicePoint.Expect100Continue = false;
                request.ServicePoint.ConnectionLimit = int.MaxValue;
    
                if (headers != null)
                {
                    FormatRequestHeaders(headers, request);
                }
    
                return request;
            }
    
    
            /// <summary>
            /// 格式化请求头信息
            /// </summary>
            /// <param name="headers"></param>
            /// <param name="request"></param>
            private static void FormatRequestHeaders(Dictionary<string, string> headers, HttpWebRequest request)
            {
                foreach (var hd in headers)
                {
                    //因为HttpWebRequest中很多标准标头都被封装成只能通过属性设置,添加的话会抛出异常
                    switch (hd.Key.ToLower())
                    {
                        case "connection":
                            request.KeepAlive = false;
                            break;
                        case "content-type":
                            request.ContentType = hd.Value;
                            break;
                        case "transfer-enconding":
                            request.TransferEncoding = hd.Value;
                            break;
                        default:
                            request.Headers.Add(hd.Key, hd.Value);
                            break;
                    }
                }
            }
    
    
            /// <summary>
            /// 格式化Get请求参数
            /// </summary>
            /// <param name="url">URL</param>
            /// <param name="parameters">参数</param>
            /// <param name="paraEncoding">编码格式</param>
            /// <returns></returns>
    
            private static string FormatGetParametersToUrl(string url, Dictionary<string, string> parameters, Encoding paraEncoding)
            {
                if (url.IndexOf("?") < 0)
                    url += "?";
                int i = 0;
                string sendContext = "";
                foreach (var parameter in parameters)
                {
                    if (i > 0)
                    {
                        sendContext += "&";
                    }
    
                    sendContext += HttpUtility.UrlEncode(parameter.Key, paraEncoding)
                           + "=" + HttpUtility.UrlEncode(parameter.Value, paraEncoding);
                    ++i;
                }
    
                url += sendContext;
                return url;
            }
    
    
            /// <summary>
            /// 格式化Post请求参数
            /// </summary>
            /// <param name="parameters">编码格式</param>
            /// <param name="dataEncoding">编码格式</param>
            /// <param name="contentType">类型</param>
            /// <returns></returns>
            private static byte[] FormatPostParameters(Dictionary<string, string> parameters, Encoding dataEncoding, string contentType)
            {
                string sendContext = "";
                int i = 0;
                if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json")
                {
                    sendContext = "{";
                }
    
                foreach (var para in parameters)
                {
                    if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json")
                    {
                        if (i > 0)
                        {
                            if (para.Value.StartsWith("{"))
                            {
                                sendContext += string.Format(@",""{0}"":{1}", para.Key, para.Value);
                            }
                            else
                            {
                                sendContext += string.Format(@",""{0}"":""{1}""", para.Key, para.Value);
                            }
    
                        }
                        else
                        {
                            if (para.Value.StartsWith("{"))
                            {
                                sendContext += string.Format(@"""{0}"":{1}", para.Key, para.Value);
                            }
                            else
                            {
                                sendContext += string.Format(@"""{0}"":""{1}""", para.Key, para.Value);
                            }
    
                        }
                    }
                    else
                    {
                        if (i > 0)
                        {
                            sendContext += string.Format("&{0}={1}", para.Key, HttpUtility.UrlEncode(para.Value, dataEncoding));
                        }
                        else
                        {
                            sendContext = string.Format("{0}={1}", para.Key, HttpUtility.UrlEncode(para.Value, dataEncoding));
                        }
                    }
    
                    i++;
                }
    
                if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json")
                {
                    sendContext += "}";
                }
    
                byte[] data = dataEncoding.GetBytes(sendContext);
                return data;
            }
    
    
            private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain,
                SslPolicyErrors errors)
            {
                return true; //总是接受  
            }
    
            /// <summary>
            /// 正常GET
            /// </summary>
            /// <param name="Url"></param>
            /// <returns></returns>
            //contentType application/json or application/xml
            public static string HttpGet(string Url)
            {
                try
                {
                    string contentType = "application/json; charset=UTF-8";
                    string retString = string.Empty;
    
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                    request.Method = "GET";
                    request.ContentType = contentType;
                    request.Accept = contentType;
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    Stream myResponseStream = response.GetResponseStream();
                    StreamReader streamReader = new StreamReader(myResponseStream);
                    retString = streamReader.ReadToEnd();
                    streamReader.Close();
                    myResponseStream.Close();
                    return retString;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            /// <summary>
            /// 正常通用请求
            /// </summary>
            /// <param name="Url"></param>
            /// <param name="postDataStr"></param>
            /// <returns></returns>
            public static string HttpPost(string Url, string postDataStr)
            {
                string retString = string.Empty;
                string contentType = "application/json; charset=UTF-8";
                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                    request.Method = "POST";
                    request.ContentType = contentType;
                    request.Accept = contentType;
                    request.Timeout = 600000;//设置超时时间
                    request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
                    request.Headers.Add(String.Format("Authorization: Bearer {0}", Common.AccessToken));
    
                    Stream requestStream = request.GetRequestStream();
                    StreamWriter streamWriter = new StreamWriter(requestStream);
                    streamWriter.Write(postDataStr);
                    streamWriter.Close();
    
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    
                    Stream responseStream = response.GetResponseStream();
                    StreamReader streamReader = new StreamReader(responseStream);
                    retString = streamReader.ReadToEnd();
                    streamReader.Close();
                    responseStream.Close();
                   
                }
                catch (Exception ex)
                {
                    if (ex.GetType() == typeof(WebException))//捕获400错误
                    {
                        var response = ((WebException)ex).Response;
                        Stream responseStream = response.GetResponseStream();
                        StreamReader streamReader = new StreamReader(responseStream);
                        retString = streamReader.ReadToEnd();
                        streamReader.Close();
                        responseStream.Close();
                    }
                    else
                    {
                        retString = ex.ToString();
                    }
                }
    
                return retString;
            }
    
            /// <summary>
            /// 验证GET请求
            /// </summary>
            /// <param name="url"></param>
            /// <param name="postVars"></param>
            /// <returns></returns>
            public static string ALHttpGet(string url ,string postVars)
            {
                try
                {
                    string contentType = "application/json; charset=UTF-8";
                    string retString = string.Empty;
                    url = String.Format(url + "?{0}", postVars);
    
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                    request.Method = "GET";
                    request.ContentType = contentType;
                    request.Accept = contentType;
                    request.Headers.Add(String.Format("Authorization: Bearer {0}", Common.AccessToken));
    
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    Stream myResponseStream = response.GetResponseStream();
                    StreamReader streamReader = new StreamReader(myResponseStream);
                    retString = streamReader.ReadToEnd();
                    streamReader.Close();
                    myResponseStream.Close();
                    return retString;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            /// <summary>
            /// 验证通用请求
            /// </summary>
            /// <param name="url"></param>
            /// <param name="verb">POST PUT</param>
            /// <param name="postDataStr"></param>
            /// <returns></returns>
            public static string ALHttpRequest(string url,string verb, string postDataStr)
            {
                string retString = string.Empty;
                string contentType = "application/json; charset=UTF-8";
                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                    request.Method = verb;
                    request.ContentType = contentType;
                    request.Accept = contentType;
                    request.Timeout = 600000;//设置超时时间
                    request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
                    request.Headers.Add(String.Format("Authorization: Bearer {0}", Common.AccessToken));
    
                    Stream requestStream = request.GetRequestStream();
                    StreamWriter streamWriter = new StreamWriter(requestStream);
                    streamWriter.Write(postDataStr);
                    streamWriter.Close();
    
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    
                    Stream responseStream = response.GetResponseStream();
                    StreamReader streamReader = new StreamReader(responseStream);
                    retString = streamReader.ReadToEnd();
                    streamReader.Close();
                    responseStream.Close();
    
                }
                catch (Exception ex)
                {
                    if (ex.GetType() == typeof(WebException))//捕获400错误
                    {
                        var response = ((WebException)ex).Response;
                        Stream responseStream = response.GetResponseStream();
                        StreamReader streamReader = new StreamReader(responseStream);
                        retString = streamReader.ReadToEnd();
                        streamReader.Close();
                        responseStream.Close();
                    }
                    else
                    {
                        retString = ex.ToString();
                    }
                }
    
                return retString;
            }
    
            /// </summary> 
            /// 带验证将本地文件上传到指定的服务器(HttpWebRequest方法) 
            /// </summary> 
            /// <param name="address">文件上传到的服务器</param> 
            /// <param name="fileNamePath">要上传的本地文件(全路径)</param> 
            /// <param name="saveName">文件上传后的名称</param> 
            /// <returns>成功返回1,失败返回0</returns> 
            private static int ALUpload_Request(string url, string fileNamePath, string saveName)
            {
                int returnValue = 0;
    
                // 要上传的文件 
                FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
                BinaryReader r = new BinaryReader(fs);
    
                //时间戳 
                string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
                byte[] boundaryBytes = Encoding.ASCII.GetBytes("
    --" + strBoundary + "
    ");
    
                //请求头部信息 
                StringBuilder sb = new StringBuilder();
                sb.Append("--");
                sb.Append(strBoundary);
                sb.Append("
    ");
                sb.Append("Content-Disposition: form-data; name="");
                sb.Append("file");
                sb.Append(""; filename="");
                sb.Append(saveName);
                sb.Append(""");
                sb.Append("
    ");
                sb.Append("Content-Type: ");
                sb.Append("application/octet-stream");
                sb.Append("
    ");
                sb.Append("
    ");
                string strPostHeader = sb.ToString();
                byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);
    
                // 根据uri创建HttpWebRequest对象 
                HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(url));
                httpReq.Method = "POST";
                httpReq.Headers.Add(String.Format("Authorization: Bearer {0}", Common.AccessToken));
                //对发送的数据不使用缓存 
                httpReq.AllowWriteStreamBuffering = false;
    
                //设置获得响应的超时时间(300秒) 
                httpReq.Timeout = 300000;
                httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
                long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
                long fileLength = fs.Length;
                httpReq.ContentLength = length;
                try
                {
                 
                    //每次上传4k 
                    int bufferLength = 4096;
                    byte[] buffer = new byte[bufferLength];
    
                    //已上传的字节数 
                    long offset = 0;
    
                    //开始上传时间 
                    DateTime startTime = DateTime.Now;
                    int size = r.Read(buffer, 0, bufferLength);
                    Stream postStream = httpReq.GetRequestStream();
    
                    //发送请求头部消息 
                    postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                    while (size > 0)
                    {
                        postStream.Write(buffer, 0, size);
                        offset += size;
                        TimeSpan span = DateTime.Now - startTime;
                        double second = span.TotalSeconds;
                        Application.DoEvents();
                        size = r.Read(buffer, 0, bufferLength);
                    }
                    //添加尾部的时间戳 
                    postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                    postStream.Close();
    
                    //获取服务器端的响应 
                    WebResponse webRespon = httpReq.GetResponse();
                    Stream s = webRespon.GetResponseStream();
                    StreamReader sr = new StreamReader(s);
    
                    //读取服务器端返回的消息 
                    String sReturnString = sr.ReadLine();
                    s.Close();
                    sr.Close();
                    if (sReturnString == "Success")
                    {
                        returnValue = 1;
                    }
                    else if (sReturnString == "Error")
                    {
                        returnValue = 0;
                    }
    
                }
                catch (Exception ex)
                {
                    returnValue = 0;
                }
                finally
                {
                    fs.Close();
                    r.Close();
                }
    
                return returnValue;
            }
        }
    }
  • 相关阅读:
    Mac OS terminal 查看内存使用情况的命令
    【教程】5分钟在以太坊上发行自己的代币
    Mac下eclipse的快捷键
    Mac上编辑文本的一些实用快捷键:跳转、选中等操作
    Mysql数据库用source命令导入SQL文件,利用navicat修改MySQL用户root密码,忘记mysql密码如何修改
    比特币1个确认和6个确认的区别在哪里?什么是双花问题?
    以 1、3、bc1 开头的比特币地址都有啥区别?转账手续费那种便宜,隔离见证地址为什么手续费便宜?
    以太坊 2.0 中的 DeFi:城市、郊区、农村
    Mac版navicat生成ER图把表结构导出pdf
    下载文件(API接口,Angularjs前端)
  • 原文地址:https://www.cnblogs.com/shangdishijiao/p/12517818.html
Copyright © 2011-2022 走看看