精易论坛

标题: 鱼刺类_HTTPv5.0_稳定版本19(WinHttpAPI)网页访问新姿势完美封装 [打印本页]

作者: 鱼刺    时间: 2017-2-26 06:32
标题: 鱼刺类_HTTPv5.0_稳定版本19(WinHttpAPI)网页访问新姿势完美封装
稳定版本:19 (2017-02-26)

* WinHttpW 为 WinHttpApi封装(推荐)
* WinHttpR 为 WinHttpRequest5.1 COM对象
* WinInet  为 WinInternet 封装


特别说明:
*参考了很多相关代码,完美封装而成。并经过测试和改进了很多微软本身留下的坑。无论是效率上还是稳定性上。不服来战!
*本次设计目的并非作为私人使用。所以命名没有采用前缀鱼刺标识。就是想出点货!`(+﹏+)
*封装命名习惯完全参照了WinHttpRequest。一些新手可能看着费劲(其实就是 Open Send 完事)但建议新手还是习惯下这样的面向对象调用方式。 对以后的开发思维有很大帮助。
*封装了三种不同的网页访问类库,可满足不同环境下的需求。
*Auto模式:可自动补全必要协yi头。(无需每次访问都添加一次常用协yi头)
*AutoCookies模式:自动智能合并Cookie到内部,并可以自游灵活管理Cookies。(取/设/增/删/改)


更新记录:
' 版本19
'' 修正Auto自动补全必要协yi头模式因微软留坑原因在某些情况下补全失败的问题(WinhttpW/WinInit)
'' 应易友的建议 调整了内部递归重定向跳转的最大限制为20次(WinhttpW/WinhttpR/WinInet)
'' 调整初始设置,避免执行Send出现连接失败(WinHttpW)
'' 修正了在某些情况下崩溃的问题(WinhttpW/WinInit)
'' 改善了Send重试机制,只在某些特定情况下执行Send重试(WinhttpW/WinInit)

' 版本18
'' 对内部自动重定向也继承了Send重试机制(WinhttpW/WinInet)
'' 修正和改善了空值和带有删除标记Cookie的自动合并更新机制(WinhttpW/WinhttpR/WinInet)
'' 修正了Base64编码失败问题


插图:





Ps:版本19基本尘埃落定 感谢小伙伴们的热心测试和建议
版本20后会设计出异步上传/下载(就是可以做进度上传和下载)
设计者:Bints
QQ:521573
QQ交流群:87555687


【调查帖】你对<鱼刺多线程模块>和多线程方面有疑问吗
http://125.confly.eu.org/forum.php?mod=viewthread&tid=13988213

模块源码及例程下载: 鱼刺类_HTTPv5.0_真版本19.zip (214.9 KB, 下载次数: 12118)


作者: superhoo    时间: 2017-2-26 12:55
膜拜。。。。
大神级
作者: 专解人衣    时间: 2017-2-26 17:20
大神,大神,大神,大神,大神,大神,大神,大神,大神,
作者: barque    时间: 2017-2-26 23:47
膜拜大神啊   
作者: y2j423633    时间: 2017-2-27 00:45
这么强大的东西必须支持一下
作者: lwhy119    时间: 2017-2-27 09:51
版本19基本尘埃落定 感谢小伙伴们的热心测试和建议
作者: 咱得有自己独特    时间: 2017-2-27 10:00
*AutoCookies模式:自动智能合并Cookie到内部,并可以自游灵活管理Cookies。(取/设/增/删/改)
作者: 咱得有自己独特    时间: 2017-2-27 10:01
自由 ----- 自游   错别字
作者: shawnking    时间: 2017-2-27 10:02
牛逼啊,!
作者: 终极易人    时间: 2017-2-27 10:08
已下载保存 多谢大神
作者: jokerhuman    时间: 2017-2-27 10:12
支持  学习一下  666
作者: finna    时间: 2017-2-27 10:15

已下载保存 多谢大神
作者: 红神大大    时间: 2017-2-27 10:19
谢谢分享了
作者: ASSHOLE    时间: 2017-2-27 10:45
666666666666666666666666
作者: 真诚走天涯    时间: 2017-2-27 10:48
这个不错啊 过来支持一下
作者: 六升臣    时间: 2017-2-27 11:11
        感谢发布原创作品,精易因你更精彩!
作者: szxiao    时间: 2017-2-27 11:19
过来支持一下
作者: xiaoye110    时间: 2017-2-27 11:46
这是一条会飞的&#128032;
作者: 霸哥    时间: 2017-2-27 11:49
厉害了
作者: sunzixian001    时间: 2017-2-27 11:50
支持开源。这个打包一下
作者: 凌哥    时间: 2017-2-27 14:06
前排~
作者: bob198486    时间: 2017-2-27 14:15
鱼刺类_HTTPv5.0_稳定版本19(WinHttpAPI)网页访问新姿势完美封装
作者: sa123123    时间: 2017-2-27 18:47
支持开源~!感谢分享
作者: ljm1101    时间: 2017-2-27 19:19
感谢分享!
作者: snowfox373    时间: 2017-2-27 20:15
感谢分享该模块。
作者: 302188308    时间: 2017-2-27 20:48
下载学习学习
作者: 1049804544    时间: 2017-2-27 21:08
楼主太强了!上次看到您封装的就很佩服,没想到更新了!
作者: DerBai    时间: 2017-2-27 23:24
鱼刺依旧给力!
作者: welfare1234    时间: 2017-2-28 11:39
感谢楼主分享学习
作者: mmcc123    时间: 2017-2-28 20:02
感谢楼主分享学习
作者: 风云c    时间: 2017-3-1 07:00
感谢分享,分享伟大
作者: 云韵    时间: 2017-3-1 09:30
感谢分享,一直再用这个http
作者: 洞房花钱夜    时间: 2017-3-1 09:47
之前用的一个真多线程也不错.看看鱼刺的这个.谢谢分享
作者: yys785962193    时间: 2017-3-1 09:55
感谢分享么么哒顶顶顶顶
作者: yys785962193    时间: 2017-3-1 09:56
楼主好人一生平安
作者: long13374955    时间: 2017-3-1 22:15
#在这里快速回复#,太给力
作者: xfjd    时间: 2017-3-3 14:54

感谢楼主分享学习  
鱼刺依旧给力!
作者: lidongxu    时间: 2017-3-3 23:05
2017年3月3日23:04:23
作者: Xanto    时间: 2017-3-3 23:40
当前时间    23:40   支持!
作者: percher    时间: 2017-3-4 11:00
很好,要用了才知道,楼主为啥要英文……
作者: cjwxp    时间: 2017-3-4 11:17
感觉很牛逼,正在学习中,向高手们致敬
作者: pltemp    时间: 2017-3-4 11:56
.谢谢谢,向高手们致敬
作者: huang5918    时间: 2017-3-4 21:44
强大的东西必须支持一下
作者: lisheng386    时间: 2017-3-5 20:42
不太懂,我看看,木马程序
作者: lisheng386    时间: 2017-3-5 20:43
刚回复错了,我看看
作者: scx1125    时间: 2017-3-6 09:26
支持开源~!感谢分享
作者: 小小莹莹    时间: 2017-3-6 18:44
支持开源~!感谢分享
作者: dbrb    时间: 2017-3-7 01:16
支持开源~!感谢分享
作者: 蒲公半岛    时间: 2017-3-7 14:25
多学习,支持一下
作者: 黄老邪2012    时间: 2017-3-7 18:10
谢谢分享,下载学习
作者: wuyuexiaoqi    时间: 2017-3-8 02:05
66666666666666666666666666666666
作者: billrob    时间: 2017-3-9 08:59
给力,感谢分享
作者: 新气象    时间: 2017-3-10 15:24
好强大,支持分享。
作者: 倾风听雨声    时间: 2017-3-12 17:17
支持开源~!感谢分享
作者: wangwei168    时间: 2017-3-13 18:50
感谢楼主分享
作者: 坦克总动员    时间: 2017-3-14 11:06
谢谢,感觉十分好用
作者: 62651345    时间: 2017-3-14 15:45
支持开源,感谢楼主。
作者: ozoo0314    时间: 2017-3-17 13:36
支持支持哈
作者: fxgou    时间: 2017-3-17 20:54
虽然一直没用上,但非常的强大啊.
作者: zyxceng    时间: 2017-3-17 20:58
谢谢楼主分享
作者: gongtengbsg    时间: 2017-3-19 10:55
WinHttpW 弄的太棒了。能自行选择命令的使用,太给力
作者: hyi    时间: 2017-3-20 05:14
支持开源~!感谢分享
作者: 393763    时间: 2017-3-21 18:47
给力,必须兹瓷,感谢分享
作者: 淡绿色的小鬼    时间: 2017-3-21 20:44
牛牛牛牛................
作者: 希望在田野    时间: 2017-3-21 22:26
666666666666666666
作者: jeechou    时间: 2017-3-24 13:53
棒棒哒
作者: Boymido    时间: 2017-3-25 13:28
支持开源~!感谢分享
作者: damnedvi    时间: 2017-3-27 15:26
好东西!!
作者: 我是符号    时间: 2017-3-27 20:09
正则表达式与支持库冲突,希望改进.
作者: 易造轮    时间: 2017-3-31 12:08
建议搞个curl模块
作者: qq1447159481    时间: 2017-4-1 02:39
支持开源~!感谢分享
作者: dawei2099    时间: 2017-4-8 00:21
感谢发布原创作品
作者: 958829253    时间: 2017-4-9 21:54
支持开源~!感谢分享
作者: badlwolf    时间: 2017-4-16 08:33
支持一个!!!!!!!!
作者: uyhj    时间: 2017-4-17 11:00

支持开源~!感谢分享
作者: zhanmao257    时间: 2017-4-20 13:47
好好学习!!!很需要
作者: jps1215    时间: 2017-4-25 23:04
用来看看到底怎么样的?
新人,感谢楼主
作者: fengyishen    时间: 2017-5-4 21:45
@Bints 好尴尬,为什么文本命令和精易一样,调用起来冲突了。不用精易的话,你的模块又不带JSON之类的功能,哎
作者: aslyr    时间: 2017-5-4 23:15
很好很强大
作者: imoling    时间: 2017-5-10 16:09
这个可以哦。用vb经常要写头信息。习惯了。。是可以自定义cookie的吧。
作者: 依旧破晓    时间: 2017-5-15 09:20
新技能已get√
作者: lyw1989    时间: 2017-5-26 04:48
新技能已get√
作者: bottlebread    时间: 2017-5-26 22:08
-9]=-]=-=-
作者: 请叫我宇哥    时间: 2017-6-6 19:03

作者: airaz    时间: 2017-6-9 14:40
说好的 易语言是中文啊!!!! 那么多english.............................
作者: cuilei632    时间: 2017-7-2 15:07
很好看的,支持
作者: yangaoqi    时间: 2017-7-20 12:13
谢谢楼主分享
作者: 逗笔小新    时间: 2017-7-22 10:27
1104361313
作者: 850536360    时间: 2017-7-28 12:14
谢谢楼主分享
作者: xiaoawen    时间: 2017-7-30 00:14
感谢鱼刺的无私奉献。。
作者: zenglix    时间: 2017-8-1 09:14
新技能已get√
作者: gulibo2001    时间: 2017-8-1 20:35
手里有C#的HttpWebRequest里面ssl提到了x509证书协yi用鱼刺应该怎么写呢?
  1. public class HttpService
  2.     {

  3.         public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
  4.         {
  5.             //直接确认,否则打不开   
  6.             return true;
  7.         }

  8.         public static string Post(string xml, string url, bool isUseCert, int timeout)
  9.         {
  10.             System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接

  11.             string result = "";//返回结果

  12.             HttpWebRequest request = null;
  13.             HttpWebResponse response = null;
  14.             Stream reqStream = null;

  15.             try
  16.             {
  17.                 //设置最大连接数
  18.                 ServicePointManager.DefaultConnectionLimit = 200;
  19.                 //设置https验证方式
  20.                 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  21.                 {
  22.                     ServicePointManager.ServerCertificateValidationCallback =
  23.                             new RemoteCertificateValidationCallback(CheckValidationResult);
  24.                 }

  25.                 /***************************************************************
  26.                 * 下面设置HttpWebRequest的相关属性
  27.                 * ************************************************************/
  28.                 request = (HttpWebRequest)WebRequest.Create(url);

  29.                 request.Method = "POST";
  30.                 request.Timeout = timeout * 1000;

  31.                 //设置代理服务器
  32.                 //WebProxy proxy = new WebProxy();                          //定义一个网关对象
  33.                 //proxy.Address = new Uri(WxPayConfig.PROXY_URL);              //网关服务器端口:端口
  34.                 //request.Proxy = proxy;

  35.                 //设置POST的数据类型和长度
  36.                 request.ContentType = "text/xml";
  37.                
  38.                 byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
  39.                 request.ContentLength = data.Length;
  40.                 Console.WriteLine(request.Headers);
  41.                 //是否使用证书
  42.                 if (isUseCert)
  43.                 {
  44.                 //    string path = HttpContext.Current.Request.PhysicalApplicationPath;
  45.                 //    X509Certificate2 cert = new X509Certificate2(path + Config.SSLCERT_PATH, Config.SSLCERT_PASSWORD);
  46.                 //    request.ClientCertificates.Add(cert);
  47.                 ////    Log.Debug("WxPayApi", "PostXml used cert");
  48.                 }

  49.                 //往服务器写入数据
  50.                 reqStream = request.GetRequestStream();
  51.                 reqStream.Write(data, 0, data.Length);
  52.                 reqStream.Close();
  53.                
  54.                 //获取服务端返回
  55.                 response = (HttpWebResponse)request.GetResponse();

  56.                 //获取服务端返回数据
  57.                 StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  58.                
  59.                 result = sr.ReadToEnd().Trim();
  60.                 sr.Close();
  61.             }
  62.             //catch (System.Threading.ThreadAbortException e)
  63.             //{
  64.             //   // Log.Error("HttpService", "Thread - caught ThreadAbortException - resetting.");
  65.             //   // Log.Error("Exception message: {0}", e.Message);
  66.             //    System.Threading.Thread.ResetAbort();
  67.             //}
  68.             //catch (WebException e)
  69.             //{
  70.             // //   Log.Error("HttpService", e.ToString());
  71.             //    if (e.Status == WebExceptionStatus.ProtocolError)
  72.             //    {
  73.             //    //    Log.Error("HttpService", "StatusCode : " + ((HttpWebResponse)e.Response).StatusCode);
  74.             //     //   Log.Error("HttpService", "StatusDescription : " + ((HttpWebResponse)e.Response).StatusDescription);
  75.             //    }
  76.             //    throw new WxPayException(e.ToString());
  77.             //}
  78.             //catch (Exception e)
  79.             //{
  80.             //   // Log.Error("HttpService", e.ToString());
  81.             //    throw new WxPayException(e.ToString());
  82.             //}
  83.             finally
  84.             {
  85.                 //关闭连接和流
  86.                 if (response != null)
  87.                 {
  88.                     response.Close();
  89.                 }
  90.                 if (request != null)
  91.                 {
  92.                     request.Abort();
  93.                 }
  94.             }
  95.             return result;
  96.         }

  97.         /// <summary>
  98.         /// 处理http GET请求,返回数据
  99.         /// </summary>
  100.         /// <param name="url">请求的url地址</param>
  101.         /// <returns>http GET成功后返回的数据,失败抛WebException异常</returns>
  102.         public static string Get(string url)
  103.         {
  104.             System.GC.Collect();
  105.             string result = "";

  106.             HttpWebRequest request = null;
  107.             HttpWebResponse response = null;

  108.             //请求url以获取数据
  109.             try
  110.             {
  111.                 //设置最大连接数
  112.                 ServicePointManager.DefaultConnectionLimit = 200;
  113.                 //设置https验证方式
  114.                 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  115.                 {
  116.                     ServicePointManager.ServerCertificateValidationCallback =
  117.                             new RemoteCertificateValidationCallback(CheckValidationResult);
  118.                 }

  119.                 /***************************************************************
  120.                 * 下面设置HttpWebRequest的相关属性
  121.                 * ************************************************************/
  122.                 request = (HttpWebRequest)WebRequest.Create(url);

  123.                 request.Method = "GET";

  124.                 //设置代理
  125.                 //WebProxy proxy = new WebProxy();
  126.                 //proxy.Address = new Uri(WxPayConfig.PROXY_URL);
  127.                 //request.Proxy = proxy;

  128.                 //获取服务器返回
  129.                 response = (HttpWebResponse)request.GetResponse();

  130.                 //获取HTTP返回数据
  131.                 StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  132.                 result = sr.ReadToEnd().Trim();
  133.                 sr.Close();
  134.             }
  135.             //catch (System.Threading.ThreadAbortException e)
  136.             //{
  137.             //  //  Log.Error("HttpService", "Thread - caught ThreadAbortException - resetting.");
  138.             //   // Log.Error("Exception message: {0}", e.Message);
  139.             //    System.Threading.Thread.ResetAbort();
  140.             //}
  141.             //catch (WebException e)
  142.             //{
  143.             // //   Log.Error("HttpService", e.ToString());
  144.             //    if (e.Status == WebExceptionStatus.ProtocolError)
  145.             //    {
  146.             //     //   Log.Error("HttpService", "StatusCode : " + ((HttpWebResponse)e.Response).StatusCode);
  147.             //     //   Log.Error("HttpService", "StatusDescription : " + ((HttpWebResponse)e.Response).StatusDescription);
  148.             //    }
  149.             //    throw new Exception(e.ToString());
  150.             //}
  151.             //catch (Exception e)
  152.             //{
  153.             // //   Log.Error("HttpService", e.ToString());
  154.             //    throw new Exception(e.ToString());
  155.             //}
  156.             finally
  157.             {
  158.                 //关闭连接和流
  159.                 if (response != null)
  160.                 {
  161.                     response.Close();
  162.                 }
  163.                 if (request != null)
  164.                 {
  165.                     request.Abort();
  166.                 }
  167.             }
  168.             return result;
  169.         }
  170.     }
复制代码

作者: 大浪    时间: 2017-8-6 11:01
感谢分享,很给力!~
作者: jfjdjd    时间: 2017-8-8 21:02
谢谢分享。
作者: newok1    时间: 2017-8-8 21:06
弄成中文最好了  再简化下,像精易那样直接调用网页_访问就最好了
作者: 司徒西    时间: 2017-8-8 21:08
很给力!~很给力!~
作者: gedawen    时间: 2017-8-18 16:44
感谢楼主分享
作者: love355024    时间: 2017-9-24 02:03
谢谢楼主无私分享
作者: juwairenzhang    时间: 2017-10-5 23:31
前来支持。
作者: wudeshuai    时间: 2017-10-9 11:32
已经选择收听




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4