Http请求基本方法

1.Http请求基本方法

/// <summary>
        /// Http请求基本方法
        /// </summary>
        /// <param name="content"></param>
        /// <param name="url"></param>
        /// <param name="method"></param>
        /// <param name="data"></param>
        /// <param name="referer"></param>
        /// <param name="contentTp"></param>
        /// <param name="headers"></param>
        /// <returns></returns>
        public bool Request(ref string content, string url, string method, byte[] data, string referer = "", string contentTp = "", NameValueCollection headers = null)
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);

            request.Method = method;
            request.Timeout = Timeout;
            request.AllowAutoRedirect = false;
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60";
            request.Headers.Add("Accept-Language", "zh-TW,en;q=0.8,zh-CN;q=0.7,zh;q=0.5,zh-HK;q=0.3,en-US;q=0.2");
            request.Headers.Add("Accept-Encoding", "gzip,deflate");   /// gzip 如何判断并且解码 测试是否可以暂时先注释  https://www.crifan.com/set_accept_encoding_header_to_gzip_deflate_return_messy_code/
            request.AutomaticDecompression = DecompressionMethods.GZip;
            request.Headers.Add("Cache-Control", "max-age=0");
            request.KeepAlive = true;


            if (Proxy != null)
            {
                request.Proxy = Proxy;
            }

            if (!string.IsNullOrEmpty(referer))
            {
                request.Referer = referer;
            }

            if (headers != null && headers.Count > 0)
            {
                foreach (string key in headers.AllKeys)
                {
                    request.Headers.Add(key, headers[key]);
                }
            }

            if (cookieContainer == null)
            {
                cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
            }
            else
            {
                request.CookieContainer = cookieContainer;
            }

            if (method.ToLower() == "post")
            {
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                request.Headers.Add("Upgrade-Insecure-Requests", "1");
                request.ContentType = contentTp;

                if (data != null && data.Length > 0)
                {
                    request.ContentLength = data.Length;
                    using (Stream stream = request.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }
            }
            else
            {
                request.Accept = "text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8";
            }

            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

            try
            {
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    if (headers != null && headers.Count > 0)
                    {
                        foreach (string key in headers.AllKeys)
                        {
                            response.Headers.Add(key, headers[key]);
                        }
                    }

                    if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.RedirectMethod || response.StatusCode == HttpStatusCode.Found || response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect)
                    {
                        if (response.StatusCode == HttpStatusCode.Found || response.StatusCode == HttpStatusCode.RedirectMethod || response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect)
                        {
                            string redirectUrl = GetRedirectUrl(url, response.Headers["Location"]);
                            return Request(ref content, redirectUrl, "GET", null, url, contentTp);
                        }

                        Stream stream = response.GetResponseStream();
                        StreamReader streamReader = new StreamReader(stream, defaultEncoding);

                        content = streamReader.ReadToEnd();
                        streamReader.Close();
                        stream.Close();
                        response.Close();


                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            catch (WebException e)
            {
                var res = (HttpWebResponse)e.Response;

                StreamReader sr = new StreamReader(res.GetResponseStream());

                var strHtml = sr.ReadToEnd();

                if (e.Response != null)
                {
                    using (Stream respStream = e.Response.GetResponseStream())
                    {
                        StreamReader streamReader = new StreamReader(respStream, Encoding.UTF8);
                        content = streamReader.ReadToEnd();
                        streamReader.Close();
                        respStream.Close();
                        e.Response.Close();
                    }
                }
                return false;
            }
            catch (Exception e)
            {
                content = e.Message;
                return false;
            }
        }

获取跳转url

 /// <summary>
        /// 跳转时,获取跳转URL
        /// </summary>
        /// <param name="url"></param>
        /// <param name="location"></param>
        /// <returns></returns>
        public static string GetRedirectUrl(string url, string location)
        {
            try
            {
                if (location.StartsWith("https://") || location.StartsWith("http://"))
                    return location;
                string newUrl = url;
                if (location.StartsWith("/"))
                {
                    newUrl = url.Substring(0, url.Substring(8).IndexOf("/") + 8);
                    return newUrl + location;
                }
                else if (location.StartsWith("../"))
                {
                    while (location.StartsWith("../"))
                    {
                        if (newUrl.IndexOf("/") > 0)
                        {
                            newUrl = newUrl.Substring(0, newUrl.LastIndexOf("/"));
                        }
                        location = location.Substring(3);
                    }
                    return newUrl + "/" + location;
                }
                else if (location.StartsWith("./"))
                {
                    if (newUrl.IndexOf("/") > 0)
                    {
                        newUrl = newUrl.Substring(0, newUrl.LastIndexOf("/"));
                    }
                    location = location.Substring(2);
                    return newUrl + "/" + location;
                }
                else
                {
                    if (newUrl.IndexOf("/") > 0)
                    {
                        newUrl = newUrl.Substring(0, newUrl.LastIndexOf("/"));
                    }
                    return newUrl + "/" + location;
                }
            }
            catch
            {
                return url;
            }
        }

2.带文件的form提交

 /// <summary>
        /// 带文件的Form提交
        /// </summary>
        /// <param name="content"></param>
        /// <param name="url"></param>
        /// <param name="formData"></param>
        /// <param name="referer"></param>
        /// <returns></returns>
        public bool FileRequest(ref string content, string url, List<FormItem> formData, string referer, string lang = "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2")
        {
            try
            {
                string boundary = "---------------------------255132704032490"; //+ DateTime.Now.Ticks.ToString();

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.KeepAlive = true;
                request.CookieContainer = cookieContainer;
                request.ContentType = "multipart/form-data; boundary=" + boundary;
                request.Method = "POST";
                request.Timeout = Timeout;
                request.AllowAutoRedirect = false;
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0";
                request.Headers.Add("Accept-Language", lang);
                request.Headers.Add("Accept-Encoding", "deflate, br");
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                request.Headers.Add("Upgrade-Insecure-Requests", "1");


                if (!string.IsNullOrEmpty(referer))
                    request.Referer = referer;

                if (Proxy != null)
                {
                    request.Proxy = Proxy;
                }

                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

                byte[] bdBytes = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");
                byte[] brBytes = Encoding.UTF8.GetBytes("\r\n");

                long length = bdBytes.Length;

                MemoryStream mStream = new MemoryStream();

                foreach (var item in formData)
                {
                    StringBuilder sb = new StringBuilder();

                    if (item.IsFile)
                    {

                        if (string.IsNullOrWhiteSpace(item.FilePath))
                        {
                            sb.Append($"--{boundary}\r\n");
                            sb.Append($"Content-Disposition: form-data; name=\"{item.Name}\"; filename=\"{item.FileName}\"\r\n");
                            sb.Append($"Content-Type: {item.ContentTp}");
                            sb.Append("\r\n");
                            sb.Append("\r\n");
                            sb.Append("\r\n");
                        }
                        else
                        {
                            if (string.IsNullOrWhiteSpace(item.FileName))
                            {
                                sb.Append("--");
                                sb.Append(boundary);
                                sb.Append("\r\n");
                                sb.Append("Content-Disposition: form-data; name=\"");
                                sb.Append(item.Name);
                                sb.Append("\"; filename=\"");
                                sb.Append(System.IO.Path.GetFileName(item.FilePath));
                                sb.Append("\"");
                                sb.Append("\r\n");
                                sb.Append("Content-Type: ");
                                sb.Append(item.ContentTp);
                                sb.Append("\r\n");
                                sb.Append("\r\n");
                            }
                            else
                            {
                                sb.Append("--");
                                sb.Append(boundary);
                                sb.Append("\r\n");
                                sb.Append("Content-Disposition: form-data; name=\"");
                                sb.Append(item.Name);
                                sb.Append("\"; filename=\"");
                                sb.Append(item.FileName);
                                sb.Append("\"");
                                sb.Append("\r\n");
                                sb.Append("Content-Type: ");
                                sb.Append(item.ContentTp);
                                sb.Append("\r\n");
                                sb.Append("\r\n");
                            }
                        }
                    }
                    else
                    {
                        sb.Append("--");
                        sb.Append(boundary);
                        sb.Append("\r\n");
                        sb.Append("Content-Disposition: form-data; name=\"");
                        sb.Append(item.Name);
                        sb.Append("\"");
                        sb.Append("\r\n");
                        sb.Append("\r\n");
                        sb.Append(item.Value);
                        sb.Append("\r\n");
                    }

                    string formTxt = sb.ToString();

                    byte[] data = Encoding.UTF8.GetBytes(formTxt);

                    mStream.Write(data, 0, data.Length);

                    length += data.Length;

                    if (item.IsFile)
                    {
                        if (!string.IsNullOrWhiteSpace(item.FilePath))
                        {
                            FileStream stream = new FileStream(item.FilePath, FileMode.Open, FileAccess.Read);

                            length += stream.Length;

                            byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)stream.Length))];

                            int nRead = 0;

                            while ((nRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                            {
                                mStream.Write(buffer, 0, nRead);
                            }

                            mStream.Write(brBytes, 0, brBytes.Length);

                            length += brBytes.Length;
                        }
                    }
                }

                /// 循环结束,需要增加结束标记 长度之前已经默认
                mStream.Write(bdBytes, 0, bdBytes.Length);
                mStream.Flush();

                request.ContentLength = length;

                long n = mStream.Length;

                using (Stream stream = request.GetRequestStream())
                {
                    /// 回头需要校验代码
                    byte[] data = mStream.GetBuffer();

                    stream.Write(data, 0, (int)mStream.Length);
                }
                HttpWebResponse res;
                try
                {
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        response.Headers.Add("Accept-Language", lang);
                        string redirectUrl = GetRedirectUrl(url, response.Headers["Location"]);

                        /// 判断是否跳转
                        if (response.StatusCode == HttpStatusCode.Found || response.StatusCode == HttpStatusCode.RedirectMethod || response.StatusCode == HttpStatusCode.Moved || response.StatusCode == HttpStatusCode.Redirect)
                        {
                            var headers = new NameValueCollection();
                            headers.Add("Accept-Language", lang);
                            return Get(ref content, redirectUrl, null, referer, headers);
                        }
                        else
                        {
                            Stream stream = response.GetResponseStream();
                            StreamReader streamReader = new StreamReader(stream, System.Text.Encoding.UTF8);
                            content = streamReader.ReadToEnd();
                            streamReader.Close();
                            stream.Close();
                        }
                        response.Close();

                        return true;
                    }
                }
                catch (WebException ex)
                {
                    res = (HttpWebResponse)ex.Response;

                    StreamReader sr = new StreamReader(res.GetResponseStream());

                    var strHtml = sr.ReadToEnd();
                    //MainForm.Instance.Console("表单提交:" + e.Message);
                    return false;
                }


            }
            catch
            {
                //MainForm.Instance.Console("表单提交:" + e.Message);
                return false;
            }
        }

3.HTTP POST方式请求数据(带图片)

 /// <summary>
        /// HTTP POST方式请求数据(带图片)
        /// </summary>
        /// <param name="url">URL</param>        
        /// <param name="param">POST的数据</param>
        /// <param name="fileByte">图片Byte</param>
        /// <returns></returns>
        public string Post(string url, IDictionary<object, object> param, byte[] fileByte)
        {
            try
            {
                string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
                byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

                HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
                wr.ContentType = "multipart/form-data; boundary=" + boundary;
                wr.UserAgent = "RK_C# 1.2";
                wr.Method = "POST";

                //wr.Timeout = 150000;
                //wr.KeepAlive = true;

                //wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
                Stream rs = null;
                try
                {
                    rs = wr.GetRequestStream();
                }
                catch { return "无法连接.请检查网络."; }
                string responseStr = null;

                string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
                foreach (string key in param.Keys)
                {
                    rs.Write(boundarybytes, 0, boundarybytes.Length);
                    string formitem = string.Format(formdataTemplate, key, param[key]);
                    byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                    rs.Write(formitembytes, 0, formitembytes.Length);
                }
                rs.Write(boundarybytes, 0, boundarybytes.Length);

                string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
                string header = string.Format(headerTemplate, "image", "i.gif", "image/gif");//image/jpeg
                byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
                rs.Write(headerbytes, 0, headerbytes.Length);

                rs.Write(fileByte, 0, fileByte.Length);

                byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--");
                rs.Write(trailer, 0, trailer.Length);
                rs.Close();

                WebResponse wresp = null;
                try
                {
                    wresp = wr.GetResponse();

                    Stream stream2 = wresp.GetResponseStream();
                    StreamReader reader2 = new StreamReader(stream2);
                    responseStr = reader2.ReadToEnd();

                    reader2.Close();
                    stream2.Close();
                    reader2.Dispose();
                    stream2.Dispose();
                }
                catch
                {
                    throw;
                }
                finally
                {
                    if (wresp != null)
                    {
                        wresp.Close();
                        wresp = null;
                    }
                    wr.Abort();
                    wr = null;

                }
                return responseStr;
            }
            catch
            {
                //MainForm.Instance.Console("Ruokuai:" + e.Message);
                return "";
            }
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容