引入 Web 的最简单的交互模型是一个应用程序,该应用程序预先接受输入并在stdout
. 在这种情况下,正如未知海报所提到的,您可以使用CGI。但是由于 CGI 的性质,这只有在从用户那里收集一页中的所有信息、发送到应用程序并在一页中返回结果时才有效(在最简单的意义上)。这是因为每次使用 CGI 调用页面都会产生一个新的独立进程来服务请求。(现在还有其他更高效的解决方案,比如FastCGI它保留了一个进程池。)如果您的应用程序是交互式的,因为它收集一些信息,呈现一些结果,打印一些选项,收集更多用户输入,然后产生更多结果,则需要对其进行调整。
以下是 C++ 中最简单的 CGI 程序:
#include <iostream>
int main(int argc, char* argv[])
{
std::cout << "Content-type: text/plain\n" << std::endl;
std::cout << "Hello, CGI World!" << std::endl;
}
它所做的只是返回内容类型,后跟一个空行,然后是带有通常无聊问候的实际内容。
要接受用户输入,您可以用 HTML 编写一个表单,POST
目标是您的应用程序。它将被传递一个包含请求参数的字符串,采用通常的 HTTP 样式:
foo.cgi?QTY=123&N=41&DESC=Simple+Junk
然后,您需要解析查询字符串(通过QUERY_STRING
环境变量传递给程序)以从表单中收集输入字段以传递给您的应用程序。请注意,解析参数字符串是大量安全漏洞的来源。为您进行解析的 C++(Google 搜索显示很多)的 CGI 库绝对值得。查询数据可以通过以下方式获得:
const char* data = getenv("QUERY_STRING");
因此,您至少需要更改您的应用程序以接受来自name=value
成对查询字符串的输入。如果您不想,甚至不需要生成 HTML;text/plain
只需返回开头的内容类型。然后您可以稍后使用 HTML 对其进行改进(并相应地更改内容类型)。
还有其他更复杂的解决方案,包括整个 Web 框架,例如Wt。但这将涉及对您的应用程序进行相当大的更改,您说您希望避免这种情况。