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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.41/5 (19投票s)

2003 年 10 月 20 日

BSD

3分钟阅读

viewsIcon

240744

downloadIcon

9344

用于 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 期望三个变量或参数:namerate 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 函数调用包含在捕获 WebFormExceptiontry-catch 块中。

try {// web.h calls
} catch(WebFormException ex)
{ 
  cout << ex.getMessage(); 
}

在运行演示之前,从 servlet 文件夹将 InterestServlet.class 复制到您的已启用 Java 的 Web 服务器的相应 script 文件夹中。

历史

  • 2003 年 10 月 20 日:提交给 CodeProject
  • 2008 年 12 月 30 日:更新了源代码和演示项目
© . All rights reserved.