在之前的 C++ 教程中,您学习了构建应用程序和程序的 C++ 语言各种语法和方法的基础知识。本文将向您展示如何将您的 C++ 软件链接到万维网。为此,您必须熟悉 CGI 的基础知识。
通用网关接口(CGI)是一组标准,用于指定数据如何从 Web 服务器传输、Web 用户的请求如何转发到应用程序,以及如何将其返回给用户。任何请求网页的用户都将从服务器接收该网页。通常,Web 服务器将表单数据发送给快速应用程序软件,该软件处理信息并可能回复确认消息。通用网关接口(CGI)是服务器和应用程序之间交换数据的协议或标准。它是 Web 的 HTTP 协议(HTTP)的一个组成部分。
为了理解 CGI 的概念,让我们检查一下访问者访问特定 URL 以浏览网页时发生的情况。
如果您正在创建网站并需要 CGI 应用程序来控制它,您可以将应用程序的名称包含在您的 HTML 代码使用的 URL(统一资源定位符)中。
程序员在使用 CGI 编程之前,应确认 Web 服务器支持 CGI 并已配置为处理 CGI 应用程序。CGI 文件是 C++ 可执行文件,通常具有 .cgi 扩展名。Apache Web 服务器默认配置为在 /var/www/cgi-bin 下执行 CGI 应用程序。任何 CGI 应用程序(如 Perl、shell 等)都必须在 Web 服务器上运行,程序员才能使用它。
#include <iostream>
using namespace std;
int main()
{
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Hello learnEtutorials </title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<h3> <b>The Very First CGI program </b> </h2>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
输出
Content-type:text/html
第一个 CGI 程序
/var/www/cgi-bin 目录
Content type:此 MIME 字符串标识检索到的文件的格式并描述其结构。
Expires :Date:这指定了当前网页上信息过期的日期。
Location: URL:必须提供作为请求 URL 替换的 URL。
Last-modified:Date:资源最近一次修改的时间。
Content-length:N:表示数据大小(以字节为单位)的数字。浏览器使用变量“N”报告预期的下载时间。
Set-Cookie: string:Cookie 是使用通过它传递的字符串设置的。
CONTENT LENGTH:如果需要,指定长度(以字节为单位)。它只能通过 POST 请求访问。
CONTENT TYPE:如果需要,提供内容的类型或数据类型。
HTTP_COOKIE:如果键类型中存在 cookie,HTTP COOKIE 将返回访问者的 cookie。
HTTP USER AGENT:访问者的浏览器类型。有关发出请求的用户代理的信息包含在请求头字段中。
PATH INFO:它提供 CGI 脚本的路径。
REMOTE ADDR:远程主机的科学地址,或者发出请求的访问者的科学地址。
REMOTE HOST:访问者的主机名,或发出请求的主机的完全限定名称。
#include <iostream>
#include <stdlib.h>
using namespace std;
const string ENV[ 24 ] = {
"COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",
"HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING",
"HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION",
"HTTP_HOST", "HTTP_USER_AGENT", "PATH",
"QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT",
"REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME",
"SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN",
"SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",
"SERVER_SIGNATURE","SERVER_SOFTWARE" };
int main () {
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>CGI Environment Variables</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<table border = \"0\" cellspacing = \"2\">";
for ( int i = 0; i < 24; i++ ) {
cout << "<tr><td>" << ENV[ i ] << "</td><td>";
// attempt to retrieve value of environment variable
char *value = getenv( ENV[ i ].c_str() );
if ( value != 0 ) {
cout << value;
} else {
cout << "Environment variable does not exist.";
}
cout << "</td></tr>\n";
}
cout << "</table><\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
您一定遇到过许多需要将数据从浏览器传输到 Web 服务器,然后再传输到 CGI 程序的情况。浏览器通常使用两种不同的方法将此信息提供给 Web 服务器。这些技术是 GET 方法和 POST 方法。
用户数据经过编码并添加到页面请求中,然后通过 GET 方法发送。问号字符用于表示页面和编码数据之间的断点,如下所示:
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
GET 方法是浏览器和 Web 服务器之间传输数据的标准方法,它会生成一个长字符串,显示在浏览器“位置”框中。切勿通过 GET 方法向服务器发送密码或任何其他敏感信息。GET 方法的请求字符串长度限制为 1024 个字符。
使用 GET 方法时,信息通过 QUERY_STRING HTTP 标头传递,您的 CGI 程序可以通过 QUERY_STRING 环境变量访问它。
HTTP 协议是无状态的。然而,对于商业网站来说,需要在不同页面之间保持会话信息。例如,一个用户的注册需要访问多个页面才能完成。但是,如何在所有网页中跟踪用户的会话数据呢?
记住并跟踪偏好、销售、佣金以及为提供更好的访客体验或网站统计所需数据的最有效方法通常是使用 cookie。
您的服务器以 cookie 的形式向访问者的浏览器发送一些数据。浏览器可能会接受该 cookie。如果接受,则会在访问者的硬盘上保存一份纯文本记录。当访问者访问您网站上的另一个页面时,现在可以检索该 cookie。一旦检索到,您的服务器就会记住/知道存储了什么。
纯文本中的 5 个可变长度字段构成了一个名为“cookie”的数据记录。
Expires:这表示 cookie 何时过期。如果此项留空,当访问者关闭浏览器时,cookie 将过期。
Domain:这显示网站的域名。
Path:这显示创建 cookie 的网页或目录的 URL。如果您希望从任何目录或页面获取 cookie,请将此字段留空。
Secure:如果此字段中出现“secure”一词,则只能使用安全服务器检索 cookie。如果此字段留空,则没有此类限制。
Value = 名称 - 键值对用于存储和检索 cookie。