TA的每日心情 | 奋斗 2020-6-5 22:18 |
---|
签到天数: 22 天 [LV.4]偶尔看看III
|
我们得把http://wgbcwsoft.web-108.com/1.51
换成http://demo.wgbcw.com/dzx151gbk
,也就是说前面四课中所提到的
换成
1.51 换成 dzx151gbk,因演示站安装的是gbk版,所以得区分下。呵呵某些免费虚拟主机还是不给力呀,不多说继续写下面的内容。
在第四课中我们用易语言中的“HTTP读文件”命令,测试后达不到我们的要求,所以今天我们用API来实现我们要的功能。
我们先看下WinInet.dll里的几个关于HTTP协议方面API函数(这里就先提几个我们用到的):InternetOpen 初始化 WinInet.dll;InternetConnect 建立 interner 的连接;HttpOpenRequest 打开一个HTTP请求;InternetCloseHandle 关闭一个单一的 internet 句柄;HttpSendRequest 向 HTTP 服务器发送指定的请求;InternetReadFile 从一个打开的句柄中读取数据。(注:要看祥细介绍请直接点击API函数进去看具体声明。)
按照HTTP客户端处理流程具体如下:
InternetOpen——InternetConnect——HttpOpenRequest——HttpSendRequest——InternetReadFile。我们就依照这个流程就可以来写代码了。要调用这几个API,我们还要在“DLL命令定义表”中定义下这几个API函数,代码略。
1、用InternetOpen初始化WinInet.dll:
先简单了解下InternetOpen的参数介绍第一参数是HTTP协议的用户代理,而我们在第一课中所取到的协议头(Headers),应该知道HTTP协议的用户代理是啥了,就是User-Agent(用户-代理) Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)
,为了方便调用Headers,我们先做如下定义:- .版本 2
- .数据类型 Request, , Headers结构或称数据类型
- .成员 Accept, 文本型, , , 招收内容
- .成员 AcceptEncoding, 文本型, , , 接收编码Accept-Encoding
- .成员 AcceptLanguage, 文本型, , , 接收语言Accept-Language
- .成员 CacheControl, 文本型, , , 缓存控制Cache-Control
- .成员 Connection, 文本型, , , 连接方式
- .成员 ContentLength, 整数型, , , 连接长度Content-Length
- .成员 ContentType, 文本型, , , 连接类型Content-Type
- .成员 Cookie, 文本型, , , 不用解释了
- .成员 Host, 文本型, , , 主机
- .成员 Referer, 文本型, , , 提交者
- .成员 UserAgent, 文本型, , , 用户代理User-Agent
复制代码 此时我们的第一个参数就是- Request.UserAgent="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)";
复制代码 我们顺便把Request结构内容也帖出来,方便讲述:- .版本 2
- Request.Accept = “image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*”
- Request.AcceptEncoding = “gzip,deflate”
- Request.AcceptLanguage = “zh-cn”
- Request.CacheControl = “no-cache”
- Request.Connection = “Keep-Alive”
- Request.ContentLength = 61
- Request.ContentType = “application/x-www-form-urlencoded”
- Request.Host = “demo.wgbcw.com”
- Request.Referer = “http://demo.wgbcw.com/dzx151gbk/forum.php”
- Request.UserAgent = “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)”
复制代码 InternetOpen中的第二个参数为HTTP访问类型,而我们要直接连接到服务器,所以这参数为1或者在易语言中做个常量定义,看个人习惯了。InternetOpen中的第三个参数为指向代理服务器的名字,由于我们这没用代理服务器,所以设为空字符串。InternetOpen中的第四个参数为代理主机名列表或 IP 地址,同第三个参数一样,设为空字符串。InternetOpen中的第五个参数为指定函数的行为影响的各种选项。由于我们要保持端口号一至,所以此参数为0或在易语言中定义常量。根据上面所述易语言中的代码应该写为:- 初始化WinInet句柄 = InternetOpen (Request.UserAgent, #INTERNET_OPEN_TYPE_DIRECT, “”, “”, #INTERNET_INVALID_PORT_NUMBER)
复制代码 2、用InternetConnect建立 interner 的连接:
先简单了解下API函数InternetConnect的参数介绍第一个参数为初始化 WinInet.dll 成功返回的句柄,即上面代码的“初始化WinInet句柄”。第二个参数为互联网服务器的主机名或IP地址,我们可调用上面的Request.Host。第三个参数为要连接到的服务器上的 TCP/IP 端口号,通常情况下默认都是80,常量调用为:#INTERNET_DEFAULT_HTTP_PORT。第四个参数为要登录的用户的名称,通常情况下在FTP协议中此参数才设置,在HTTP中这里为空,当然在此API介绍中说到HTTP协议中此参数为空时,会导致服务器返回一个错误,在测试中没有影响到我们的,暂时先设置为空,以后碰到再祥细分析。第五个参数用于登录的密码,这参数也是在FTP协议中,我们也设置为空。第六个参数为访问指定的服务类型,我们这访问的是HTTP服务器,那么我们这就设置为3或常量调用#INTERNET_SERVICE_HTTP。第七个参数为特定服务使用的标志。按照API的祥细说明,当第六个参数为INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE时会导致应用程序使用被动 FTP 语义,这样看来目前不知道参数为啥,所以暂且设置为0。第八个参数用于确定在返回的句柄回调的应用程序上下文的指针。同参数七设置为0。根据上面所述易语言中的代码应该写为:- interner连接句柄 = InternetConnect (初始化WinInet句柄, Request.Host, #INTERNET_DEFAULT_HTTP_PORT, “”, “”, #INTERNET_SERVICE_HTTP, 0, 0)
复制代码 3、用HttpSendRequest打开一个HTTP请求:
先简单了解下HttpSendRequest的参数介绍,第一个参数为建立 interner 的连接成功返回的句柄,即上面代码的“interner连接句柄”。第二个参数为在请求中使用动词名称("POST"或"GET")指针,由于我们第一课中所截取的Request-Line数据为“POST”方式,那我们这就设置为“POST”。第三个参数为指定动词的目标对象的名称,即第一课的Request-Line目标对象名称为“/dzx151gbk/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1”。第四个参数为为 HTTP版本的指针,即第一课的Request-Line里的“HTTP/1.1”。第五个参数为指定第三个参数URL 请求获得文本的地址,由于这里没有必要取“/dzx151gbk/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1”的地址,可以忽略,由于此参数是指针,也就是地址,那我们把它设置为0。第六个参数为客户接受的内容类型的指针的数组指针。由于默认为接收文本类型,我们就没有必要指定了,设置为0。如果要指定的话那就为Request.Accept。第七个参数为指定互联网标志位的掩码,我先选用如果资源已被修改重载HTTP资源,也就是INTERNET_FLAG_RELOAD=2147483648。第八个参数为应用程序定义的值的指针,由于具体没用到这里忽略,设置为0。根据上面所述易语言中的代码应该写为:- 打开Http请求句柄 = HttpOpenRequest (interner连接句柄, “POST”, “/dzx151gbk/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1”, “HTTP/1.1”, 0, 0, #INTERNET_FLAG_RELOAD, 0)
复制代码 4、用HttpSendRequest向HTTP服务器发送指定的请求:
先简单了解下HttpSendRequest的参数介绍,第一个参数为打开一个HTTP请求句柄的成功的返回值,即上面代码的"打开Http请求句柄"。第二个参数为追加到请求的附加协议头(Headers),应为- Headers = “Accept:*/*” + #换行符 + “Accept-Encoding:” + Request.AcceptEncoding + #换行符 + “Accept-Language:” + Request.AcceptLanguage + #换行符 + “Cache-Control:” + Request.CacheControl + #换行符 + “Connection:” + Request.Connection + #换行符 + “Content-Length:” + 到文本 (Request.ContentLength) + #换行符 + “Content-Type:” + Request.ContentType + #换行符 + “Host:” + Request.Host + #换行符 + “Referer:” + Request.Referer + #换行符 + “User-Agent:” + Request.UserAgent
复制代码 。
第三个参数为附加协议头的字符的长度,为 “取文本长度 (Headers)”。第四个参数为可被发送到服务器的资源或信息,POST里常用,在本教程中实际就是发送的会员账号密码等信息,则为- PostData = “username=” + 编辑框1.内容 + “&password=” + 编辑框2.内容 + “&quickforward=yes&handlekey=ls”
复制代码 。第五个参数为参数四的文本长度,即“取文本长度 (PostData)”。根据上面所述易语言中的代码应该写为:HttpSendRequest (打开Http请求句柄, Headers, 取文本长度 (Headers), PostData, 取文本长度 (PostData))
。如果发送指定请求成功的话,我们就可以利用InternetReadFile函数来获取相关的数据了,由于时间问题,今天就写到这里,明天有空了继续……睡觉去了。
今天来接着讲,首先我们把上面的代码小结下:- .版本 2
- Request.Accept = “image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*”
- Request.AcceptEncoding = “gzip,deflate”
- Request.AcceptLanguage = “zh-cn”
- Request.CacheControl = “no-cache”
- Request.Connection = “Keep-Alive”
- Request.ContentLength = 61
- Request.ContentType = “application/x-www-form-urlencoded”
- Request.Host = “demo.wgbcw.com”
- Request.Referer = “http://demo.wgbcw.com/dzx151gbk/forum.php”
- Request.UserAgent = “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)” ' 本数据是在IE8.0下载获取
- ' Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)’本数据是在IE6.0下载获取
- 初始化WinInet句柄 = InternetOpen (Request.UserAgent, #INTERNET_OPEN_TYPE_DIRECT, “”, “”, #INTERNET_INVALID_PORT_NUMBER)
- .如果 (初始化WinInet句柄 ≠ 0)
- interner连接句柄 = InternetConnect (初始化WinInet句柄, Request.Host, #INTERNET_DEFAULT_HTTP_PORT, “”, “”, #INTERNET_SERVICE_HTTP, 0, 0)
- .否则
- InternetCloseHandle (初始化WinInet句柄)
- 信息框 (“创建句柄 失败”, 0, )
- .如果结束
- .如果 (interner连接句柄 ≠ 0)
- 打开Http请求句柄 = HttpOpenRequest (interner连接句柄, “POST”, “/dzx151gbk/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1”, “HTTP/1.1”, 0, 0, #INTERNET_FLAG_RELOAD, 0)
- .否则
- InternetCloseHandle (interner连接句柄)
- 信息框 (“连接句柄 失败”, 0, )
- .如果结束
- ' HTTP协议头(Headers)
- Headers = “Accept:*/*” + #换行符 + “Accept-Encoding:” + Request.AcceptEncoding + #换行符 + “Accept-Language:” + Request.AcceptLanguage + #换行符 + “Cache-Control:” + Request.CacheControl + #换行符 + “Connection:” + Request.Connection + #换行符 + “Content-Length:” + 到文本 (Request.ContentLength) + #换行符 + “Content-Type:” + Request.ContentType + #换行符 + “Host:” + Request.Host + #换行符 + “Referer:” + Request.Referer + #换行符 + “User-Agent:” + Request.UserAgent
- ' HTTP发送的附加数据
- PostData = “username=” + 编辑框1.内容 + “&password=” + 编辑框2.内容 + “&quickforward=yes&handlekey=ls”
复制代码 5、我们前面提到了InternetReadFile函数来获取返回的数据。那还是先简单了解下InternetReadFile函数的参数介绍:第一个参数为HttpSendRequest 向HTTP服务器发送指定的请求成功的返回值,那此值为“打开Http请求句柄”;第二个参数为缓冲区返回数据指针,在易语言中没有强调指针的概念,当然我们可以用“字节集”和“传址”来实现这个指针,本课中定义为字节集类型的“返回数据”;第三个参数为要读取缓冲区数据的长度,那此值为“取字节集长度 (返回数据)”;第四个参数为接收返回数据读取字节数的字节值,由于我们在接收数据时都是为了取下一条数据要发送的内容,所以我们这通常情况都是接收服务器当前返回字节的最大值,在本教程中定义为“dwByteRead”。根据上面所讲取“返回数据”的代码应该写为:- InternetReadFile (打开Http请求句柄, 返回数据, 取字节集长度 (返回数据), dwByteRead)
复制代码 在前面几个课里讲述到和服务器通信的数据中下面一条数据内容总是或多或少是上一条数据的返回数据,所以我们在这之后就要经常用到HttpSendRequest和InternetReadFile这两个API。一个是发送请求,一个是读取返回的数据。所以我们的关键就是取返回数据,请大家在写代码时参考第二课、第三课和第四课的祥细分析,这里我们就略过了,仅发代码做参考。再补充个demo.wgbcw.com域名下的“输入正确账号密码取验证码”的HttpWatch数据文件:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|