用 C++ 编写 HTTP 客户端的类






4.41/5 (19投票s)
用于 Win32 HTTP 调用的包装类、URL 编码等。
引言
如今,越来越多的开发人员希望为企业编写分布式事务应用程序,并利用服务器端技术的速度、安全性和可靠性。 Java 已经成为成千上万的开发人员编写可扩展程序(通常作为 Servlet 或 JSP)的选择,这些程序驻留在 Web 服务器上,并为客户端执行业务方法。 (我们在这里不会讨论 EJB!!)
这些客户端通常是 Web 浏览器中运行的 HTML 表单或 Java Applet。 如果您的旧版 C++ 应用程序想要变得轻量级,并将所有繁重的工作(如运行业务逻辑、访问数据库等)交给 Java Servlet,该怎么办? 您将如何处理 HTTP 通信、URL 编码变量等等? 我们将在本文中讨论的类将向您展示用 C++ 编写 HTTP 客户端有多么容易,甚至比为同一目的编写 Java Applet 还容易!! 你相信我的话。
背景
您必须熟悉 OOP、互联网协议等。 如果您已经使用 Java、ASP 或其他一些服务器端技术开发了 Web 应用程序,那么您会发现本文很容易理解。 要运行演示代码,您必须能够访问支持 Java 的 Web 服务器,我使用了 Tomcat。 如果您的 Web 服务器不支持 Java,请用您的 Web 服务器可以解释的任何语言编写服务器脚本,并在演示代码中更改服务器脚本的名称。
Using the Code
本节实际上是对演示项目的逐步讲解。
首先,在 C++ 文件中包含以下 include
语句,该文件使用我们的 HTTP 类
// some standard headers
#include <string>
#include <vector>
#include <iostream>
using namespace std;
// windows headers
#include <windows.h>
#include <wininet.h>
// our header
#include "web.h"
using namespace openutils;
该程序还必须与 wininet.lib 链接。 在 VC++ 中,您可以通过转到 Project-> Settings-> Link-> Object/Library Modules 并在默认库名称的末尾添加 wininet.lib 来实现这一点。
接下来,我们声明一个 WebForm
类的对象。
WebForm wf;
您应该告诉 WebForm
它应该连接的 Web 服务器的名称
wf.setHost("https://:8080");
您可以将“localhost:8080
”替换为任何有效的 HTTP URL,例如
"www.codeproject.com" or "208.45.33.44"
WebForm
期望的下一个参数是 Web 服务器应该执行的脚本文件的名称
wf.setScriptFile("/banking/servlet/InterestServlet");
请查看您的 Web 服务器的文档以了解您的 Servlet 文件的路径。 在 Tomcat 服务器上,在“webapps”子文件夹中创建文件夹层次结构“banking\WEB-INF\classes”,并将 IntersetServlet.class 文件放置在该文件夹中。
现在您已准备好添加要发送到 Servlet 以进行处理的变量。 InterestServlet
期望三个变量或参数:name
、rate
和 amt
。 可以通过调用 putVariable()
函数将这些变量及其值添加到 WebForm
对象。
wf.putVariable("name","James Dean");
wf.putVariable("rate","14");
wf.putVariable("amt","1200.89");
我们可以通过调用 sendRequest()
函数向 Servlet 发送 HTTP 请求。
wf.sendRequest();
Servlet 将发回一个响应,其中将包含 HTML 格式的计算出的利率。 可以在客户端读取此响应到缓冲区中
char response[101];
if(wf.getResponse(response,100))
{
cout << endl << response << endl;
}
我们还可以使用 WebForm
类来编写像 Web 浏览器一样的简单客户端。 这是一个代码片段,用于下载一个知名网站的主页
wf.setHost(http://www.microsoft.com);
wf.setScriptFile("/default.html");
// or wf.setScriptFile("");
wf.sendRequest();
char buff[10 * 1024];
if(wf.getResponse(buff,sizeof(buff)))
{
cout << buff << endl;
}
else
{
cout << "No response from server" << endl;
}
注释
web.h 定义了一个实用程序类,用于以 HTTP 编码格式编码 string
。 此类由 WebForm
内部使用。 下面演示了此类和解码器类的用法
string str = "AC-0099";
string str_enc = URLEncoder::encode(str); // AC%2d0099
string dec = URLDecoder::decode(str_enc); // AC-0099
请记住将所有 web.h 函数调用包含在捕获 WebFormException
的 try-catch
块中。
try {// web.h calls
} catch(WebFormException ex)
{
cout << ex.getMessage();
}
在运行演示之前,从 servlet 文件夹将 InterestServlet.class 复制到您的已启用 Java 的 Web 服务器的相应 script 文件夹中。
历史
- 2003 年 10 月 20 日:提交给 CodeProject
- 2008 年 12 月 30 日:更新了源代码和演示项目