zoukankan      html  css  js  c++  java
  • HttpHelper类及调用

    首先列出HttpHelper类

    /// <summary>
        /// Http操作类
        /// </summary>
        public class HttpHelper
        {
            private static log4net.ILog mLog = log4net.LogManager.GetLogger("HttpHelper");
    
            [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);
    
            [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern bool InternetGetCookie(string lpszUrlName, string lbszCookieName, StringBuilder lpszCookieData, ref int lpdwSize);
            public static StreamReader mLastResponseStream = null;
            public static System.IO.StreamReader LastResponseStream
            {
                get { return mLastResponseStream; }
            }
            private static CookieContainer mCookie = null;
            public static CookieContainer Cookie
            {
                get { return mCookie; }
                set { mCookie = value; }
            }
            private static CookieContainer mLastCookie = null;
            public static HttpWebRequest CreateWebRequest(string url, HttpRequestType httpType, string contentType, string data, Encoding requestEncoding, int timeout, bool keepAlive)
            {
                if (String.IsNullOrWhiteSpace(url))
                {
                    throw new Exception("URL为空");
                }
                HttpWebRequest webRequest = null;
                Stream requestStream = null;
                byte[] datas = null;
                switch (httpType)
                {
                    case HttpRequestType.GET:
                    case HttpRequestType.DELETE:
                        if (!String.IsNullOrWhiteSpace(data))
                        {
                            if (!url.Contains('?'))
                            {
                                url += "?" + data;
                            }
                            else url += "&" + data;
                        }
                        if(url.StartsWith("https:"))
                        {
                            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
                            ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
                        }
                        webRequest = (HttpWebRequest)WebRequest.Create(url);
                        webRequest.Method = Enum.GetName(typeof(HttpRequestType), httpType);
                        if (contentType != null)
                        {
                            webRequest.ContentType = contentType;
                        }
                        if (mCookie == null)
                        {
                            webRequest.CookieContainer = new CookieContainer();
                        }
                        else
                        {
                            webRequest.CookieContainer = mCookie;
                        }
                        if (keepAlive)
                        {
                            webRequest.KeepAlive = keepAlive;
                            webRequest.ReadWriteTimeout = timeout;
                            webRequest.Timeout = 60000;
                            mLog.Info("请求超时时间..." + timeout);
                        }
                        break;
                    default:
                        if (url.StartsWith("https:"))
                        {
                            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
                            ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
                        }
                        webRequest = (HttpWebRequest)WebRequest.Create(url);
                        webRequest.Method = Enum.GetName(typeof(HttpRequestType), httpType);
                        if (contentType != null)
                        {
                            webRequest.ContentType = contentType;
                        }
                        if (mCookie == null)
                        {
                            webRequest.CookieContainer = new CookieContainer();
                        }
                        else
                        {
                            webRequest.CookieContainer = mCookie;
                        }
                        if (keepAlive)
                        {
                            webRequest.KeepAlive = keepAlive;
                            webRequest.ReadWriteTimeout = timeout;
                            webRequest.Timeout = 60000;
                            mLog.Info("请求超时时间..." + timeout);
                        }
                        if (!String.IsNullOrWhiteSpace(data))
                        {
                            datas = requestEncoding.GetBytes(data);
                        }
                        if (datas != null)
                        {
                            webRequest.ContentLength = datas.Length;
                            requestStream = webRequest.GetRequestStream();
                            requestStream.Write(datas, 0, datas.Length);
                            requestStream.Flush();
                            requestStream.Close();
                        }
                        break;
                }
                //mLog.InfoFormat("请求 Url:{0},HttpRequestType:{1},contentType:{2},data:{3}", url, Enum.GetName(typeof(HttpRequestType), httpType), contentType, data);
                return webRequest;
            }
            public static CookieContainer GetLastCookie()
            {
                return mLastCookie;
            }
            /// <summary>
            /// 设置HTTP的Cookie,以后发送和请求用此Cookie
            /// </summary>
            /// <param name="cookie">CookieContainer</param>
            public static void SetHttpCookie(CookieContainer cookie)
            {
                mCookie = cookie;
            }
            private static HttpWebRequest mLastAsyncRequest = null;
            public static HttpWebRequest LastAsyncRequest
            {
                get { return mLastAsyncRequest; }
                set { mLastAsyncRequest = value; }
            }
            /// <summary>
            /// 发送请求
            /// </summary>
            /// <param name="url">请求Url</param>
            /// <param name="httpType">请求类型</param>
            /// <param name="contentType">contentType:application/x-www-form-urlencoded</param>
            /// <param name="data">请求数据</param>
            /// <param name="encoding">请求数据传输时编码格式</param>
            /// <returns>返回请求结果</returns>
            public static string SendRequest(string url, HttpRequestType httpType, string contentType, string data, Encoding requestEncoding, Encoding reponseEncoding, params AsyncCallback[] callBack)
            {
    
                int timeout = 0;
                bool keepAlive = false;
                if (callBack != null && callBack.Length > 0 && callBack[0] != null)
                {
                    keepAlive = true;
                    timeout = 1000*60*60;
                    mLog.Info("写入读取超时时间..." + timeout);
                }
               // mLog.Info("开始创建请求....");
                HttpWebRequest webRequest = CreateWebRequest(url, httpType, contentType, data, requestEncoding,timeout,keepAlive);
                string ret = null;
               // mLog.Info("创建请求结束....");
                if (callBack != null && callBack.Length > 0 && callBack[0] != null)
                {
                   // mLog.Info("开始异步请求....");
                    mLastAsyncRequest = webRequest;
                    webRequest.BeginGetResponse(callBack[0], webRequest);
                }
                else
                {
                   // mLog.Info("开始同步请求....");
                    StreamReader sr = new StreamReader(webRequest.GetResponse().GetResponseStream(), reponseEncoding);
                    ret = sr.ReadToEnd();
                    sr.Close();
                }
                mLastCookie = webRequest.CookieContainer;
                //mLog.InfoFormat("结束请求 Url:{0},HttpRequestType:{1},contentType:{2},结果:{3}", url, Enum.GetName(typeof(HttpRequestType), httpType), contentType,ret);
                return ret;
            }
    
            /// <summary>
            /// Http上传文件
            /// </summary>
            public static string HttpUploadFile(string url, string path)
            {
                using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    // 设置参数
                    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                    CookieContainer cookieContainer = new CookieContainer();
                    request.CookieContainer = cookieContainer;
                    request.AllowAutoRedirect = true;
                    request.AllowWriteStreamBuffering = false;
                    request.SendChunked = true;
                    request.Method = "POST";
                    request.Timeout = 300000;
    
                    string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
                    request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
                    byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("
    --" + boundary + "
    ");
                    byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("
    --" + boundary + "--
    ");
                    int pos = path.LastIndexOf("\");
                    string fileName = path.Substring(pos + 1);
    
                    //请求头部信息
                    StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name="file";filename="{0}"
    Content-Type:application/octet-stream
    
    ", fileName));
                    byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
                    request.ContentLength = itemBoundaryBytes.Length + postHeaderBytes.Length + fs.Length + endBoundaryBytes.Length;
                    using (Stream postStream = request.GetRequestStream())
                    {
                        postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
                        postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                        int bytesRead = 0;
    
                        int arrayLeng = fs.Length <= 4096 ? (int)fs.Length : 4096;
                        byte[] bArr = new byte[arrayLeng];
                        int counter = 0;
                        while ((bytesRead = fs.Read(bArr, 0, arrayLeng)) != 0)
                        {
                            counter++;
                            postStream.Write(bArr, 0, bytesRead);
                        }
                        postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
                    }
    
                    //发送请求并获取相应回应数据
                    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                    {
                        //直到request.GetResponse()程序才开始向目标网页发送Post请求
                        using (Stream instream = response.GetResponseStream())
                        {
                            StreamReader sr = new StreamReader(instream, Encoding.UTF8);
                            //返回结果网页(html)代码
                            string content = sr.ReadToEnd();
                            return content;
                        }
                    }
                }
            }
    
            public static string HttpUploadFile(string url, MemoryStream files, string fileName)
            {
                using (MemoryStream fs = files)
                {
                    // 设置参数
                    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                    CookieContainer cookieContainer = new CookieContainer();
                    request.CookieContainer = cookieContainer;
                    request.AllowAutoRedirect = true;
                    request.AllowWriteStreamBuffering = false;
                    request.SendChunked = true;
                    request.Method = "POST";
                    request.Timeout = 300000;
    
                    string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
                    request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
                    byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("
    --" + boundary + "
    ");
                    byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("
    --" + boundary + "--
    ");
    
                    //请求头部信息
                    StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name="file";filename="{0}"
    Content-Type:application/octet-stream
    
    ", fileName));
                    byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
                    request.ContentLength = itemBoundaryBytes.Length + postHeaderBytes.Length + fs.Length + endBoundaryBytes.Length;
                    using (Stream postStream = request.GetRequestStream())
                    {
                        postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
                        postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                        int bytesRead = 0;
    
                        int arrayLeng = fs.Length <= 4096 ? (int)fs.Length : 4096;
                        byte[] bArr = new byte[arrayLeng];
                        int counter = 0;
                        fs.Position = 0;
                        while ((bytesRead = fs.Read(bArr, 0, arrayLeng)) != 0)
                        {
                            counter++;
                            postStream.Write(bArr, 0, bytesRead);
                        }
                        postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
                    }
    
                    //发送请求并获取相应回应数据
                    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                    {
                        //直到request.GetResponse()程序才开始向目标网页发送Post请求
                        using (Stream instream = response.GetResponseStream())
                        {
                            StreamReader sr = new StreamReader(instream, Encoding.UTF8);
                            //返回结果网页(html)代码
                            string content = sr.ReadToEnd();
                            return content;
                        }
                    }
                }
            }
    
            #region public static 方法
    
            /// <summary>
            /// 将请求的流转化为字符串
            /// </summary>
            /// <param name="info"></param>
            /// <returns></returns>
            public static string GetStr(Stream info)
            {
                string result = "";
                try
                {
                    using (StreamReader sr = new StreamReader(info, System.Text.Encoding.UTF8))
                    {
                        result = sr.ReadToEnd();
                        sr.Close();
                    }
                }
                catch
                {
                }
                return result;
            }
    
            /// <summary>
            /// 参数转码
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            public static string stringDecode(string str)
            {
                return HttpUtility.UrlDecode(HttpUtility.UrlDecode(str, System.Text.Encoding.GetEncoding("UTF-8")), System.Text.Encoding.GetEncoding("UTF-8"));
            }
    
            /// <summary>
            /// json反序列化
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="json"></param>
            /// <returns></returns>
            public static T Deserialize<T>(string json)
            {
                try
                {
                    T obj = Activator.CreateInstance<T>();
                    using (MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
                    {
                        DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                        return (T)serializer.ReadObject(ms);
                    }
                }
                catch
                {
                    return default(T);
                }
            }
    
            #endregion
    
            public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
            {   // 总是接受  
                return true;
            }
        
        }
        public enum HttpRequestType
        {
            POST,
            GET,
            DELETE,
            PUT,
            PATCH,
            HEAD,
            TRACE,
            OPTIONS
        }
    View Code

    然后列出HttpHelper的调用

    1、不带参数调用

    public bool ConnectServer()
            {
                try
                {
                    string url = "https://i.cnblogs.com";
    
                    string xml = HttpHelper.SendRequest(url, HttpRequestType.POST, null, null, Encoding.UTF8, Encoding.UTF8);
                    NormalResponse nr = HuaweiXMLHelper.GetNormalResponse(xml);
                    if (nr.Code == "0")
                    {
    HttpHelper.SetHttpCookie(HttpHelper.GetLastCookie());
                        mIsConnect = true;
                        return true;
                    }
                    else
                    {
                        mIsConnect = false;
                        return false;
                    }
                }
                catch (System.Exception ex)
                {
                    mIsConnect = false;
                    return false;
                }
            }
    View Code

    2.带参数调用

    private bool HandleIntelligentTask(string taskId,bool bStop)
            {
                try
                {
                    if (!mIsConnect)
                    {
                        return false;
                    }
                    StringBuilder sb = new StringBuilder();
                    sb.AppendFormat("<request>
    ");
                    sb.AppendFormat("<task_id>{0}</task_id>
    ", taskId);//<!-- task-id为调用方生成的UUID或其它串 -->
                    sb.AppendFormat("<status>{0}</status>
    ",bStop?0:1);
                    sb.AppendFormat("</request>
    ");
                    string xml = sb.ToString();
                    string url = mIAServerUrl + "/sdk_service/rest/video-analysis/handle-intelligent-analysis";
                    string xml2 = HttpHelper.SendRequest(url, HttpRequestType.POST, "text/plain;charset=utf-8", xml, Encoding.UTF8, Encoding.UTF8);
                    NormalResponse nr = HuaweiXMLHelper.GetNormalResponse(xml2);
                    if (nr.Code == "0")
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch (System.Exception ex)
                {
                    return false;
                }
    
            }
    View Code

    3.异步调用

    private void ReStartAlarmServer(List<string> list, string alarmUrl, Thread[] listThread)
            {
                StopAlarm(alarmUrl, listThread);
                listThread[0]= new Thread(new ThreadStart(delegate()
                            {
                                try
                                {
                                    if (!mIsConnect)
                                    {
                                        mLog.Error("未登录!--ReStartAlarmServer-结束!");
                                        return;
                                    }
                                    mLog.Info("ReStartAlarmServer开始报警连接....");
                                    if (String.IsNullOrWhiteSpace(alarmUrl)) return;
                                    mLog.InfoFormat("ReStartAlarmServer请求报警:URL={0}", alarmUrl);
                                    string xml = "task-id=0";
                                    string xml2 = HttpHelper.SendRequest(alarmUrl, HttpRequestType.POST, "application/x-www-form-urlencoded", xml, Encoding.UTF8, Encoding.UTF8, AlarmCallBack);
                                    mLog.Info("ReStartAlarmServer报警连接成功!");
                                }
                                catch (System.Threading.ThreadAbortException ex)
                                {
                                    mLog.Info("ReStartAlarmServer线程已人为终止!" + ex.Message, ex);
                                }
                                catch (System.Exception ex)
                                {
                                    mLog.Error("ReStartAlarmServer开始报警连接失败:" + ex.Message, ex);
                                    mLog.Info("ReStartAlarmServer开始重新报警连接....");
                                    mTimes = 50;
                                }
                                finally
                                {
                                   
                                }
                            }));
                listThread[0].IsBackground = true;
                listThread[0].Start();
            }
            private void AlarmCallBack(IAsyncResult ir)
            {
                try
                {
                    HttpWebRequest webRequest = (HttpWebRequest)ir.AsyncState;
                    string salarmUrl = webRequest.Address.OriginalString;
                    Thread[] alarmThead = dicAlarmUrls[salarmUrl];
                    HttpWebResponse response = (HttpWebResponse)webRequest.EndGetResponse(ir);
                    Stream stream = response.GetResponseStream();
                   alarmThead[1]=  new Thread(new ThreadStart(delegate()
                    {
                        try
                        {
                            byte[] buffer = new byte[mAlarmReadCount];
                            int count = 0;
                            string strMsg = "";
                            int startIndex = -1;
                            int endIndex = -1;
    
                            NormalResponse res = null;
                            DateTime dtStart = DateTime.Now;
                            DateTime dtEnd = DateTime.Now;
                            while (!mIsCloseAlarm)
                            {
                                count = stream.Read(buffer, 0, mAlarmReadCount);
                                if (count > 0)
                                {
                                    strMsg += Encoding.UTF8.GetString(buffer, 0, count);
                                    startIndex = strMsg.IndexOf("<response>");
                                    endIndex = strMsg.IndexOf("</response>");
                                    string xml = strMsg.Substring(startIndex, endIndex - startIndex + "</response>".Length);
                                    res = HuaweiXMLHelper.GetNormalResponse(xml);
                                    strMsg = strMsg.Substring(endIndex + "</response>".Length);
                                    startIndex = -1;
                                    endIndex = -1;
                                    break;
                                }
                                dtEnd = DateTime.Now;
                                if ((dtEnd - dtStart).TotalSeconds > 10)
                                {
                                    throw new Exception("连接信息未有获取到,需要重启报警!");
                                }
                            }
                            while (!mIsCloseAlarm)
                            {
                                count = stream.Read(buffer, 0, mAlarmReadCount);
                                if (count > 0)
                                {
                                    string temp = Encoding.UTF8.GetString(buffer, 0, count);
                                    strMsg += temp;
                                    while (strMsg.Length > 0)
                                    {
                                        if (startIndex == -1)//未发现第一个<task-info>
                                        {
                                            startIndex = strMsg.IndexOf("<task-info>");
                                            if (startIndex == -1)
                                            {
                                                if (strMsg.Length >= "<task-info>".Length)
                                                {
                                                    strMsg = strMsg.Substring(strMsg.Length - "<task-info>".Length);
                                                }
                                                break;
                                            }
                                        }
                                        if (startIndex >= 0)
                                        {
                                            int i = startIndex + "<task-info>".Length;
                                            int taskInfoEndIndex = strMsg.IndexOf("</task-info>", i);
                                            if (taskInfoEndIndex > 0)//必须有任务结束节点
                                            {
                                                i = taskInfoEndIndex + "</task-info>".Length;
                                                int i1 = strMsg.IndexOf("</attach-rules>", i);//找到轨迹节点结束
                                                int i2 = strMsg.IndexOf("</alarm>", i);//找到报警节点结束,发现一条报警
                                                if (i1 == -1 && i2 == -1)//没有标志结束
                                                {
                                                    break;
                                                }
                                                else if (i1 >= 0 && (i1 < i2 || i2 == -1))//找到轨迹结束节点
                                                {
                                                    strMsg = strMsg.Substring(i1 + "</attach-rules>".Length);
                                                    startIndex = -1;
                                                    endIndex = -1;
                                                    continue;
                                                }
                                                else if (i2 > 0 && (i2 < i1 || i1 == -1))//找报警节点
                                                {
                                                    endIndex = i2;//找到报警节点结束,发现一条报警
                                                    string alarmXml = "<taskalarm>" + strMsg.Substring(startIndex, endIndex - startIndex + "</alarm>".Length) + "</taskalarm>";
    
                                                    Thread th = new Thread(new ThreadStart(delegate()
                                                    {
                                                        ParseAlarmXml(alarmXml);
                                                    }));
                                                    th.IsBackground = true;
                                                    th.Start();
    
                                                    strMsg = strMsg.Substring(endIndex + "</alarm>".Length);
                                                    startIndex = -1;
                                                    endIndex = -1;
                                                    continue;
                                                }
                                            }
                                            else
                                            {
                                                break;
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    Console.WriteLine("##########读取报警反馈:无");
                                    Thread.Sleep(1000);
                                }
                            }
                        }
                        catch (System.Threading.ThreadAbortException ex)
                        {
                            mLog.Info("AlarmCallBack...7");
                            try
                            {
                                if (stream != null)
                                {
                                    stream.Close();
                                    stream.Dispose();
                                    response.Close();
                                }
                            }
                            catch
                            {
                            }
                            mLog.Info("AlarmCallBack线程已人为终止!--0" + ex.Message, ex);
                        }
                        catch(IOException ex)
                        {
                            mLog.Info("AlarmCallBack...8");
                            try
                            {
                                if (stream != null)
                                {
                                    stream.Close();
                                    stream.Dispose();
                                    response.Close();
                                }
                            }
                            catch
                            {
                            }
                        }
                        catch (ObjectDisposedException ex)
                        {
                            mLog.Info("AlarmCallBack...9");
                            mLog.Info("AlarmCallBack读取流已人为终止!--2" + ex.Message, ex);
                            try
                            {
                                if (stream != null)
                                {
                                    stream.Close();
                                    stream.Dispose();
                                    response.Close();
                                }
                            }
                            catch
                            {
                            }
                        }
                        catch (System.Exception ex)
                        {
                            mLog.Info("AlarmCallBack...10");
                              mLog.Error("AlarmCallBack 0:" + ex.Message,ex);
                              try
                              {
                                  if (stream != null)
                                  {
                                      stream.Close();
                                      stream.Dispose();
                                      response.Close();
                                  }
                              }
                              catch
                              {
                              }
                              
                            
                        }
                        finally
                        {
                            
                        }
                    }));
                   alarmThead[1].IsBackground = true;
                   alarmThead[1].Start();
    
                }
                catch (System.Exception ex)
                {
                    mLog.Info("AlarmCallBack...11");
                    mLog.Error("AlarmCallBack 1:" + ex.Message,ex);
                    mLog.Info("AlarmCallBack开始重新报警连接....3");
                    mTimes = 50;
                }
                finally
                {
                    
                }
            }
    View Code

    以上就是简单的HttpHelper类的方法使用

  • 相关阅读:
    专题——递归
    今日听郝斌老师鸡汤
    线性结构的两种常见应用之一 队列
    线性结构的两种应用之一——栈
    C++常用库函数
    洛谷 标志重捕法?
    c++复习——临考前的女娲补天 >=.<
    c++复习——类(2)
    c++复习——类(1)
    Python单元测试
  • 原文地址:https://www.cnblogs.com/sxw117886/p/7094054.html
Copyright © 2011-2022 走看看