设为首页收藏本站|繁體中文

Excel 技巧网

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

查看: 38979|回复: 87

[Excel VBA] VBA的WEB应用系列教程——HTTP通讯基础篇

  [复制链接]
发表于 2012-7-24 21:49:26 | 显示全部楼层 |阅读模式
  • 署名作者: xmyjk
  • 版权声明: 版权归本站与作者共有 除本站官方外非作者本人转载须经许可并注明出处
  • 本文来自:
  • 引用作品:
  • 适用版本: 2013 2010 2007 2003以前版本 
  • 语言环境: 简体中文
  • 学习方法: 掌握Excel技巧的关键是动手操作 | 下载 ≠ 知识


  • 免费注册成为本站会员,享用更多功能,结识更多Office办公高手!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    本帖最后由 xmyjk 于 2012-7-24 22:10 编辑

    VBA的WEB应用教程,预计按以下几方面进行发布,敬请期待:

    (1)HTTP通讯基础篇:主讲INTERNET通讯基础知识、网络数据包构成、HTTP协议简介、收发包工具使用技巧和初步在VBA中进行收发包。
    基础篇.zip (209.38 KB, 下载次数: 1386)

    评分

    参与人数 12技术分 +1 魅力值 +65 收起 理由
    Tomleej + 5 感谢帮助:)
    开心二点 + 5 **就是牛X
    zhengguide + 5 **!
    windimi007 + 5 思路巧妙:)
    NULL + 5 感谢帮助:)

    查看全部评分

     楼主| 发表于 2012-7-24 21:51:02 | 显示全部楼层
    本帖最后由 xmyjk 于 2012-7-24 22:06 编辑

    (三)初识cookie和session

    由于第一节讲了,网络通讯是静态的,http协议是无状态的。它对于我们之前的所有通讯都没有记忆能力。那出现的问题是,如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,就难以验证用户的权限和登录问题。于是,两种用于解决机制就产生了,就是Cookie和Session。

    Cookie是通过客户端记录通讯情况,其是由服务器发给客户端的特殊信息,以文本文件的方式存放在我们的电脑上(WINDOWS系统哈,浏览器会将这些信息存放在[系统盘]:\Documents and Settings\[用户名]\Cookies目录中),然后我们的浏览器每次向服务器发送请求的时候就会带上这些特殊的信息。例如,当我们登录网站时,服务器会发送一段cookie给我们,这就是我们在上面的响应阶段所说的Set-Cookie头部字段的功能,后续的通讯,在请求阶段,就会使用cookie请求字段,发送这段文本,服务器收到了这段文本,就知道我们已经登录了。
    6.jpg

    另外一个解决方案是Session,它是通过服务器来记录通讯情况。Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。当我们的浏览器首次访问或者登录服务器时,服务器就创建一个session,服务器会为该Session生成唯一的Session id,这个session id将从URL或者从cookie返回客户端,以后的HTTP请求,从cookie或者URL附上Session id,服务器接受到请求之后就会依据Session id找到相应的Session,这样,用户的状态也就记忆了。
    回复 支持 1 反对 0

    使用道具 举报

     楼主| 发表于 2012-7-24 21:49:50 | 显示全部楼层
    本帖最后由 xmyjk 于 2012-7-24 22:13 编辑

    WORD版开放下载,懒得看帖子直接下载吧。 课程一.zip (209.38 KB, 下载次数: 373)
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2012-7-24 21:50:08 | 显示全部楼层
    本帖最后由 xmyjk 于 2012-7-24 21:58 编辑

    二、HTTP协议简析

        基本上,大部分的web通讯,都是使用http协议。我们用下面的图,复习下通讯的流程(客户端发起请求,服务器回送响应):
    1.jpg

    (1)首先客户机与服务器建立连接。
    (2)建立连接后,客户机通过HTTP协议发送一个请求给服务器。
    (3)服务器接到请求后,给予相应的响应信息。
    (4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

          从流程上,可以看出,它由请求和响应构成。通讯的每次请求或相应中,都包含着两个部分:头部和主体。头部包含了构建通讯所需的信息/命令;主体包含了通信传递的数据,头部和主体之间间隔一个VBCRLF。我们还是通过,FIDDLER这个抓包软件来进行讲解,请上http://www.fiddler2.com/Fiddler2/version.asp进行下载。

          举例说明如下,请在浏览器地址栏键入:http://www.sgs.gov.cn/lz/etpsInfo.do?method=index,出现企业登记信息查询的页面,选择按注册号查询,并将310115000909792输入至下方的文本框中。如图所示:
    2.jpg

          这时,我们先打开FIDDLER,然后再按下网页的搜索按钮。这样,FIDDLER就可以捕捉到,执行搜索的HTTP请求,还能截取到查询结果的响应消息。我们分阶段进行解析。
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2012-7-24 21:50:25 | 显示全部楼层
    本帖最后由 xmyjk 于 2012-7-24 22:42 编辑

    (一)请求阶段

        如图操作,选择第一条记录,有时候就是发送查询命令的HTTP请求。选择左边的INSPECTORS的RAW标签,就可以看见HTTP请求的内容。
    3.jpg

    请求代码如下:
    POST http://www.sgs.gov.cn/lz/etpsInfo.do?method=doSearch HTTP/1.1
    Host: www.sgs.gov.cn
    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    DNT: 1
    Connection: keep-alive
    Referer: http://www.sgs.gov.cn/lz/etpsInfo.do?method=index
    Cookie: JSESSIONIDlz=00002DNpApMXAw1wHVO0vSgVGuf:16f9u5edl; JSESSIONID=0000g4T4RXnmmvxkZ2Vi0rZy3fM:132eapo0d
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 37

    searchType=2&keyWords=310115000909792

        实际情况中,有可能会看到一系列的发包记录,那实际的获取数据的发包请求又是哪一条呢?一般不用一个个记录去看,我们可以选取结果页面的一个标识语句(例如“搜索结果”啊,“注册成功”啊,这样的标示语句),在FIDDLER界面按住CTRL+F,会出现查找功能的界面,然后键入我们要查找的标识,如图,就可以搜索出到底是哪条记录。
    5.png

    从上面的RAW标签,可以看出,HTTP请求的通用格式:
            HTTP方法 URL或URL的路径部分 HTTP协议版本
            头部字段
            回车换行
            消息主体

        下面按照该格式的每个条目进行解释:
        1、首行的HTTP方法,就是请求的方法,总共有5种,但是常用的就GET和POST,GET是索取数据的请求,要求服务器返回URL指定的文档内容,或返回URL指定的数据处理过程的结果所指向的文档,是最常见的。POST是向服务器提交数据的请求,要求服务器接收并利用随附的消息主体的数据,来执行某个程序或获取文档,通常用于浏览器向服务器发送表单数据,例如提交注册信息,或者进行数据查询等。所以,如果采用GET方式,一般消息主体为空,采用POST方式的话,一般就有相应的消息主体。

        请注意,并不意味着采用GET方式就不能携带数据了,上一节我们说了,URL是可以携带我们需要传递给服务器的参数的。例如http://www.baidu.com/s?wd=苹果。可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

        那既然GET方式也可以携带参数,那两者区别又是什么呢?一是安全性,GET方式参数就在URL,提交的是密码等私密资料就不合适用GET;二是,GET方式提交的数据最多只能有1024字节,而POST则没有此限制。三是,GET一般不能改变服务器的数据,而POST可以改变服务器的数据,例如注册了个用户,服务器就多了数据条目。

        2、头部字段,头部字段主要描述的是我们的请求的内容,绝大部分是可选的。格式为“字段名称:字段值”,以下列举几个常用又比较重要的头部字段吧,其他请自行参阅HTTP协议:

          2.1 host字段:该字段指定请求资源的Intenet主机和端口号,即URL的域名部分,HTTP/1.1请求必须包含该字段。

          2.2 Referer字段:Referer字段值,就是我们发起HTTP请求时的那个页面URL,是用来控制盗链的一种方式。

          2.3 User-Agent字段:该字段的内容包含发出请求的用户信息(浏览器和系统等消息)。有时候也会作为放盗的一种方式,更多用来服务器判定依据不同用户系统情况,返回不同的兼容文档。

          2.4 Cache-Control字段:用来指定请求遵循的缓存机制。包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached等。

          2.5 Cookie字段:这是比较重要的请求头信息之一;这个我们后面详细说,先跳过。

          2.6 If-Modified-Since字段:所请求的页面在客户端的缓存中的最近更新时间;

          2.7 Pragma字段:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;

          2.8 Content-Type字段: 在使用POST方式的时候,这个字段非常关键,用来标识后附的消息主体的类型。作为抓包爱好者,理解不了就算了,写程序的时候,直接抄袭抓包软件看到的,例如上面例子的是“application/x-www-form-urlencoded”。一般POST方式,这句较少省略,如果不附上,就得不到正确的数据结果。

          2.9 Content-Length字段:表示HTTP请求的消息主体的文本长度

          2.10 If-None-Match字段:后面储存的是客户端读取的缓存中页面的缓存检验值,后面缓存中再讲;

    (3)当采用POST方式,就会携带消息主体了,这时,头部和主体之间的回车换行的标示符号,就必不可少了。主体就是请求通信传递的数据,上例中的主体内容“searchType=2&keyWords=310115000909792”就是传递我们查询所需的注册号和查询方式(按注册号查询)等参数,和GET方式一样,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

          请注意,发包的整个过程,例如消息主体,都不支持英文和数字以外的字符,如果要写入中文或特殊字符,就需要URLENCODE的函数进行转码了。后话,心急的读者自行百度,VBA URLENCODE。
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2012-7-24 21:50:44 | 显示全部楼层
    本帖最后由 xmyjk 于 2012-7-24 22:05 编辑

    (二)响应阶段
        当我们发送请求后,服务器处理完我们的请求,就会向我们的浏览器,发送响应消息了。FIDDLER中,响应消息就在请求消息的下面,一样看RAW标签,如图:

    4.jpg

    HTTP/1.0 200 OK
    Date: Sun, 22 Jul 2012 06:46:31 GMT
    Server: IBM_HTTP_Server
    Content-Length: 8292
    Content-Type: text/html; charset=UTF-8
    Content-Language: zh-CN
    Age: 312
    X-Cache: MISS from WebAudit
    Connection: keep-alive

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    ………

    HTTP响应消息的格式如下所示:
            状态行
            头部字段
            回车换行
            实体内容

    1、        状态行 = HTTP协议 [空格] 状态码 [空格] 状态解释 [回车换行]
    状态码常见的就是,200成功、400错误请求(一般我们是发送的请求有问题)、500服务器错误,其余不说明了,自行搜索百度哈。

    2、        头部字段
    响应阶段的头部字段主要描述的是服务器响应的情况。最常见的头部字段如下:
      
      2.1 Content-Type:表示后面的文档属于什么类型;
      
      2.2 Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它。
      
      2.3 Last-Modified:文档在服务器上最后更新时间。同缓存一起保存这个值,当再次访问该页面,在请求的头部字段的If-Modified-Since中再次携带这个时间值发送至服务器,如果服务器此时的文档更新时间晚于该时间,返回新页面数据,否则返回一个304(Not Modified)状态,并加载缓存数据进行显示;
      
      2.4 Set-Cookie: 服务器向客户端发送的cookie,cookie后面简析。
      
      2.5 ETag:一段文本,一般也是用于缓存是否更新的判断的校检值,当首次访问页面时候,获取这个值,同缓存一起保存,当再次访问时候,请求阶段的If-None-Match字段就会再次携带这段校检值发送至服务器,服务器判断ETag校检值是否变化,变化则返回新的页面数据,无变化则返回304,读取缓存数据显示。

    3、 和请求阶段一样,头部和实体之间用回车换行符间隔,后面的实体,就是服务器返回的网页的源代码了。视服务器文档情况,大部分情况是html格式的,这个东东,我们第二节课再讲咯。
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2012-7-24 21:51:20 | 显示全部楼层
    本帖最后由 xmyjk 于 2012-7-24 22:07 编辑

    (四)初识缓存(cache)

    缓存(cache)保存在客户端上的。当我们首次访问某个页面时,浏览器会自动保存这个页面的部分内容,例如html页面,图片等,当下一次再次访问时,缓存直接使用之前保存的数据响应访问请求,而不是向服务器再次发送请求。这样大大的节约了访问的时间。

    一般缓存判断的常见流程如下:客户端首次访问服务器后,服务器会返回该页面的Last-Modified或ETag字段值,客户端将该页面数据保存在cache中,并记录这两个属性。当客户端再次访问这个页面,请求阶段的消息,会在If-Modified-Since(对应Last-Modified)或If-None-Match(对应ETag)两个字段中携带之前在cache中保存的Last-Modified或ETag的属性值。服务器通过判断这个两个属性,判断页面是否发生变化,如无变化,客户端不需要重新下载,返回304响应。

    其他的判断方式还有使用Expires的头部字段,该字段给了一个文档的有效期,过了这个有效期,就必须重新下载。
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2012-7-24 21:51:36 | 显示全部楼层
    本帖最后由 xmyjk 于 2012-7-24 22:08 编辑

    三、如何模拟HTTP请求

    (一)在FIDDLER中模拟

    在第二节的第一点,我们抓取了,用注册号,查询企业注册信息的HTTP请求,我们怎么模拟它呢?可以在FIDDLER中进行模拟,首先复制一下,第二节第一点中,我们在INSPECTORS选项卡中ROW标签得到的HTTP请求,然后选择composer选项卡RAW标签或者PARSED标签,填入我们所要发送的HTTP请求,之前也所过了,很多字段其实是可选的,经过删减测试,最终必须的字段如下图:

    61.jpg
    62.jpg


    然后按右上的EXECUTE按钮,就可以发送请求了,然后继续在左边界面和INSPECTORS选项卡中观看是否成功。
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2012-7-24 21:51:52 | 显示全部楼层
    本帖最后由 xmyjk 于 2012-7-24 22:09 编辑

    (二)VBA中模拟

    当在FIDDLER中模拟成功后,我们就可以把相关的HTTP请求,在VBA中,套用在XMLHTTP对象上。后面的课程会详细讲这些对象的属性和方法,本次仅是演示,代码如下:
    1. Option Explicit
    2. Sub test()
    3.     With CreateObject("Microsoft.XMLHTTP")
    4.         .Open "POST", "http://www.sgs.gov.cn/lz/etpsInfo.do?method=doSearch", False
    5.         .setRequestHeader "content-type", "application/x-www-form-urlencoded"
    6.         .SEND "searchType=2&keyWords=310115000909792"
    7.         Debug.Print .responsetext
    8.     End With
    9. End Sub
    复制代码
    上述代码,仅仅模拟了HTTP请求的过程,在立即窗口输出的是网页的源代码,后面还需加工处理,以后我们的课再说,其他有一定基础的同学,可以运用正则等对象或文本处理函数,进行相关处理,获取我们所需的东东。还有转码的东西,不要急,后面也会说。还有,我们的浏览器,是怎么把这一大堆源代码,翻译成直观的东西的,下节课就会说了。

    不要小看上面这些通讯原理,没有他们,是肯定没法学好后面的内容的,特别是,网页数据防盗的破解的。
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2012-7-24 21:52:10 | 显示全部楼层
    本帖最后由 xmyjk 于 2012-7-24 22:10 编辑

    最后,小技巧,POST和GET不一定是绝对的,嘿嘿,有时候,POST的消息主体的内容,加个“?”号带到URL后边当参数,也是可以获取正确的码源的,呵呵。这个读者自己去领悟吧,哈哈。上面那个案例是不行噢,只能POST,不能用http://www.sgs.gov.cn/lz/etpsInfo.do?method=doSearch& searchType=2&keyWords=310115000909792去get,我遇到很多情况是可以的,自己找其他页面测试,哈。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    Excel技巧网的会员探讨问题仅代表其个人意见,与网站的立场无关。任何违反国家和地方相关法律法规的言论,本站有义务协助政府相关部门追究发言者的责任!
    本站中非注明转载文章与案例的版权为作者与Excel技巧网共有。若非原文作者,本站之外任何单位或个人未经允许,不得将其用于商业用途。
    若非原文作者,任何形式的非商业性转载必须获得Excel技巧网或作者允许,并注明作者和出处。
    会员发表的帖子如涉及版权纠纷,须自行负责。详情请参考注册时的网站服务条款。
    本站特聘法律顾问:沈学律师

    Archiver|手机版|Excel技巧网 ( 闽ICP备08107682号-2 ) | 闽公网安备 35020302032608号  

    GMT+8, 2018-9-22 07:26

    Powered by Discuz! X3.3

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表