65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (53投票s)

2002年6月26日

5分钟阅读

viewsIcon

789079

downloadIcon

27084

本文介绍了一个实用工具,可让您使用 HTTP 的 GET 和 POST 命令从 Web 服务器检索原始信息。

本文介绍了一个实用工具,可让您使用 HTTP 的 GETPOST 命令从 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 服务器发送和返回的标头和消息。如果 POSTGET 成功,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 服务器收到 GETPOST 请求后,会发送回响应。响应有 2 部分:标头后跟数据(中间用空行分隔)。

HTTP 标头的第一行指定了请求的状态。它以数字错误代码开头。

  • 100-199 是信息性消息,通常不使用。
  • 200-299 表示请求成功。
  • 300-399 表示请求的资源已移动;Web 服务器使用此代码进行重定向。
  • 400-499 表示客户端错误。
  • 500-599 表示服务器错误。

标头之后是 GETPOST 请求返回的数据。这通常会在浏览器屏幕上看到。

对话框包装器

MFC 对话框项目用作 Request 类的包装器。在对话框容器中插入了 Microsoft Web Browser 控件的一个实例。这使得浏览数据、发出 GETPOST 等命令变得非常容易。该控件的使用方式有两种:

  1. 当用户通过浏览器发出请求时,控件会触发 OnBeforeNavigate2 事件,该事件会被对话框程序捕获。这样,在 OnBeforeNavigate2Explorer1 函数中,可以使用它来检测是 GET 还是 POST,以及发送到 Web 服务器的标头和已发布的数据。
  2. 如果用户想使用 SendHTTP 引擎,请填写所需的 URL,完成“SendHTTPrequest”和“PostData”(如果是 POST)字段,选中 GETPOST 的单选按钮,然后单击“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.aspTestPost.asp 文件来测试您的 GET/POST 实用工具。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.