发现WEB. HTTP GET-POST 实用工具






4.97/5 (53投票s)
2002年6月26日
5分钟阅读

789079

27084
本文介绍了一个实用工具,可让您使用 HTTP 的 GET 和 POST 命令从 Web 服务器检索原始信息。
本文介绍了一个实用工具,可让您使用 HTTP 的 GET
和 POST
命令从 Web 服务器检索原始信息。
描述
此实用工具只是一个包装器,其中包含可重用的函数,允许通过嵌入在程序中的一种“迷你浏览器”以编程方式访问 Web。
此类代码有很多用途。查看一系列网页的程序,就像用户从一页浏览到下一页一样,通常称为爬虫、机器人或抓取器。此类程序通常用于编目网站、从 Web 导入外部数据,或仅仅是向 Web 服务器发送命令。您可以扩展此处提供的类的功能,以多种方式从 Internet 检索信息。
有许多第三方 DLL 和解决方案可以从网站检索数据。本文提供的函数完全独立。除了 WinSock 之外,不依赖于 WinInet
、Internet Explorer、Netscape 或任何其他软件的安装要求。WinSock 是 Windows TCP/IP 堆栈的组成部分,在任何能够运行浏览器的计算机上都可用。
每个 Internet 协议都记录在一个 RFC(意见征求稿)文档中。HTTP 记录在 RFC1945 中。此外,RFC1630、RFC1708 和 RFC1808 记录了 URL 的格式。
可以在 http://www.rfc-editor.org 找到完整的 RFC 集。
实现
该实用工具的引擎位于 Request
类中。关键函数是 SendHTTP()
。此函数接受 5 个参数并返回一个整数。第一个参数是要 POST
到或 GET
的 URL。第二个参数指定了在此请求期间要传递的任何其他 HTTP 标头。第三个和第四个参数指定要 POST
的数据和数据长度。第五个参数是指向 HTTPRequest
结构的指针,该结构将保存 Web 服务器发送和返回的标头和消息。如果 POST
或 GET
成功,SendHTTP
返回 0
;否则返回 1
表示错误。
SendHTTP()
首先解析 URL string
。URL 是一个指定 Internet 上资源确切位置的地址。URL 有几个部分,其中一些是可选的。URL 的一个示例如下:
http://www.codetools.com:80/index.html
URL 的第一部分是协议,它指定如何接收资源。协议后面是主机名。这可以是域名或 IP 地址。主机后面是端口号。如果未指定端口,则每个协议都有一个默认端口号。默认的 HTTP 端口是 80 端口。端口后面是对指定 Web 服务器的请求。如果未指定,则默认为 '/',它请求 Web 服务器的根文档。
接下来,SendHTTP()
通过调用 WinSock 的 WSAStartup()
来初始化 WinSock 库。建立套接字连接后,SendHTTP()
将请求传输到服务器。HTTP 请求有两种形式。第一种也是最简单的一种是 HTTP GET
。
HTTP GET
除了请求标头和 URL 之外,不向 Web 服务器发送任何额外信息。HTTP GET
通常使用 URL 本身来发送额外信息
第二种形式是 HTTP POST
,它将数据与请求一起发送,与 URL 分开。
通常,HTTP POST
包含标头
Content-Type:application/x-www-form-urlencoded
如果没有此标头,某些 Web 服务器(尤其是 IIS 上的 ASP)将无法识别您的参数。HTTP POST
有 2 个部分。第一部分是 HTTP 标头,与 GET
中的相同。标头包含实际请求和其他信息。与 GET
不同,POST
在标头之后(由空行分隔)包含数据。
Web 服务器收到 GET
或 POST
请求后,会发送回响应。响应有 2 部分:标头后跟数据(中间用空行分隔)。
HTTP 标头的第一行指定了请求的状态。它以数字错误代码开头。
- 100-199 是信息性消息,通常不使用。
- 200-299 表示请求成功。
- 300-399 表示请求的资源已移动;Web 服务器使用此代码进行重定向。
- 400-499 表示客户端错误。
- 500-599 表示服务器错误。
标头之后是 GET
或 POST
请求返回的数据。这通常会在浏览器屏幕上看到。
对话框包装器
MFC 对话框项目用作 Request
类的包装器。在对话框容器中插入了 Microsoft Web Browser 控件的一个实例。这使得浏览数据、发出 GET
或 POST
等命令变得非常容易。该控件的使用方式有两种:
- 当用户通过浏览器发出请求时,控件会触发
OnBeforeNavigate2
事件,该事件会被对话框程序捕获。这样,在OnBeforeNavigate2Explorer1
函数中,可以使用它来检测是GET
还是POST
,以及发送到 Web 服务器的标头和已发布的数据。 - 如果用户想使用
SendHTTP
引擎,请填写所需的 URL,完成“SendHTTPrequest
”和“PostData
”(如果是POST
)字段,选中GET
或POST
的单选按钮,然后单击“Go”按钮。IE 控件将在m_HTTPbody
字符串变量中加载从SendHTTP()
函数接收到的 HTML 格式数据。HTML 加载在OnButtonViewHttp()
中完成。
IHTMLDocument2* pHTMLDocument2;
LPDISPATCH lpDispatch;
lpDispatch = m_Browser.GetDocument();
if (lpDispatch)
{
HRESULT hr;
hr = lpDispatch->QueryInterface(IID_IHTMLDocument2,
(LPVOID*)&pHTMLDocument2);
lpDispatch->Release();
IHTMLElement* pBody;
hr = pHTMLDocument2->get_body(&pBody);
BSTR bstr;
bstr = m_HTTPbody.AllocSysString();
pBody->put_innerHTML(bstr); //insert the html
SysFreeString(bstr);
pBody->Release();
}
用法
输入 URL 地址并单击 Go 按钮。右侧是您页面的迷你浏览器。在页面上的链接和按钮上导航,以及在“PostData
”、“SendHTTPrequest
”和“ReceiveHTTPrequest
”字段中进行操作,将接收到相应的数据。Get
/Post
的单选按钮会自动修改 - IE 实例知道您是执行 GET
(您单击了一个链接)还是 POST
(您单击了一个按钮)。
您可以在“SendHTTPrequest
”编辑框中输入您的标头,在“PostData
”编辑框中输入您的 POST
数据,然后单击“Go
”按钮。浏览器将使用从“SendHTTPrequest
”和“PostData
”字段提交的标头和数据导航到您的地址。
使用 Web 目录中的 TestGet.asp 和 TestPost.asp 文件来测试您的 GET
/POST
实用工具。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。