Tutorial Study Image

C++ Web 编程


2023 年 6 月 15 日, Learn eTutorial
930

在之前的 C++ 教程中,您学习了构建应用程序和程序的 C++ 语言各种语法和方法的基础知识。本文将向您展示如何将您的 C++ 软件链接到万维网。为此,您必须熟悉 CGI 的基础知识。

CGI 是什么意思?

通用网关接口(CGI)是一组标准,用于指定数据如何从 Web 服务器传输、Web 用户的请求如何转发到应用程序,以及如何将其返回给用户。任何请求网页的用户都将从服务器接收该网页。通常,Web 服务器将表单数据发送给快速应用程序软件,该软件处理信息并可能回复确认消息。通用网关接口(CGI)是服务器和应用程序之间交换数据的协议或标准。它是 Web 的 HTTP 协议(HTTP)的一个组成部分。

CGI 的特性

  • 通用网关接口,有时也称为 CGI,是一组规定自定义脚本和 Web 服务器之间数据传输方式的准则。
  • NCSA 目前负责维护 CGI 规范,其对 CGI 的定义如下:
    • CGI 是一种外部网关程序可以用于连接信息服务器(例如 HTTP 服务器)的标准。
    • 当前版本是 CGI/1.1,CGI/1.2 正在开发中。

网页浏览

为了理解 CGI 的概念,让我们检查一下访问者访问特定 URL 以浏览网页时发生的情况。

  1. 您的浏览器请求 HTTP Web 服务器的 URL,然后连接。
  2. Web 服务器将分析 URL 并查找文件名;如果找到请求的文件,它将立即发送到浏览器,否则将显示错误通知。
  3. Web 浏览器收到 Web 服务器的响应后,会显示错误消息或接收到的文件。

如果您正在创建网站并需要 CGI 应用程序来控制它,您可以将应用程序的名称包含在您的 HTML 代码使用的 URL(统一资源定位符)中。

服务器配置

程序员在使用 CGI 编程之前,应确认 Web 服务器支持 CGI 并已配置为处理 CGI 应用程序。CGI 文件是 C++ 可执行文件,通常具有 .cgi 扩展名。Apache Web 服务器默认配置为在 /var/www/cgi-bin 下执行 CGI 应用程序。任何 CGI 应用程序(如 Perl、shell 等)都必须在 Web 服务器上运行,程序员才能使用它。

C++ CGI 程序示例


#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 程序

  • 从上述程序的编译版本创建一个可执行文件,并添加 .cgi 扩展名。
  • 此文件必须保存在

    /var/www/cgi-bin 目录

  • CGI 程序通常使用的其他 HTTP 头包括:

    Content type:此 MIME 字符串标识检索到的文件的格式并描述其结构。

    Expires :Date:这指定了当前网页上信息过期的日期。

    Location: URL:必须提供作为请求 URL 替换的 URL。

    Last-modified:Date:资源最近一次修改的时间。

    Content-length:N:表示数据大小(以字节为单位)的数字。浏览器使用变量“N”报告预期的下载时间。

    Set-Cookie: string:Cookie 是使用通过它传递的字符串设置的。

CGI 中的环境变量

CONTENT LENGTH:如果需要,指定长度(以字节为单位)。它只能通过 POST 请求访问。

CONTENT TYPE:如果需要,提供内容的类型或数据类型。

HTTP_COOKIE:如果键类型中存在 cookie,HTTP COOKIE 将返回访问者的 cookie。

HTTP USER AGENT:访问者的浏览器类型。有关发出请求的用户代理的信息包含在请求头字段中。

PATH INFO:它提供 CGI 脚本的路径。

REMOTE ADDR:远程主机的科学地址,或者发出请求的访问者的科学地址。

REMOTE HOST:访问者的主机名,或发出请求的主机的完全限定名称。

列出所有 CGI 变量的 CGI 程序。


#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;
}

 

GET 和 POST 方法

您一定遇到过许多需要将数据从浏览器传输到 Web 服务器,然后再传输到 CGI 程序的情况。浏览器通常使用两种不同的方法将此信息提供给 Web 服务器。这些技术是 GET 方法和 POST 方法。

使用 GET 方法传递信息

用户数据经过编码并添加到页面请求中,然后通过 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 环境变量访问它。

在 CGI 中使用 Cookie

HTTP 协议是无状态的。然而,对于商业网站来说,需要在不同页面之间保持会话信息。例如,一个用户的注册需要访问多个页面才能完成。但是,如何在所有网页中跟踪用户的会话数据呢?

记住并跟踪偏好、销售、佣金以及为提供更好的访客体验或网站统计所需数据的最有效方法通常是使用 cookie。

工作原理

您的服务器以 cookie 的形式向访问者的浏览器发送一些数据。浏览器可能会接受该 cookie。如果接受,则会在访问者的硬盘上保存一份纯文本记录。当访问者访问您网站上的另一个页面时,现在可以检索该 cookie。一旦检索到,您的服务器就会记住/知道存储了什么。

纯文本中的 5 个可变长度字段构成了一个名为“cookie”的数据记录。

Expires:这表示 cookie 何时过期。如果此项留空,当访问者关闭浏览器时,cookie 将过期。

Domain:这显示网站的域名。

Path:这显示创建 cookie 的网页或目录的 URL。如果您希望从任何目录或页面获取 cookie,请将此字段留空。

Secure:如果此字段中出现“secure”一词,则只能使用安全服务器检索 cookie。如果此字段留空,则没有此类限制。

Value = 名称 - 键值对用于存储和检索 cookie。