我不确定这些答案是否解决了这个问题。使用 C++ 编写 CGI 意味着读取由 Web 服务器设置的环境变量,无论您是否使用第三方库或运行哪个 Web 服务器,包括 tomcat。以下示例是获取最有趣的输入(查询字符串)的一种快速而简单的方法。如果你刚开始,我认为最好从基础开始,所以如果你决定使用某种外部库,它看起来就不那么神秘了。这应该足以让您访问 google 并弄清楚发生了什么。
#include <stdlib.h>
#include <iostream>
using namespace std;
int
main(int argc, char** argv)
{
string method = getenv("REQUEST_METHOD");
string query;
if (method == "GET")
query = getenv("QUERY_STRING");
else if (method == "POST")
cin >> query;
else
query = "Not sure what to do with method " + method;
cout << "Content-Type: text/html" << endl << endl
<< "<html>" << endl
<< query << endl
<< "</html>" << endl;
}
注意输出中的内容类型。那是一个 HTTP 标头。您可以在双 endl 之前添加任意数量的标题。暂时尝试将 Content-Type 更改为 text/plain。
将示例代码编译为shiney_cpp_cgi,将其复制到您的cgi目录(对于tomcat,通常为tomcat_root/webapps/ROOT/WEB-INF/cgi),然后使用浏览器访问它以使用GET方法:
myserver.mydomain:myport/cgi-bin/shiney_cpp_cgi?foo=bar
要发送 post 请求,请使用 CURL:
curl --data 'foo=bar' myserver.mydomain:myport/cgi-bin/shiney_cpp_cgi
要从 tomcat 提供 C++,您可以编辑 tomcat_root/conf/web.xml 并将可执行文件更改为空字符串。默认情况下,tomcat 会尝试将您的 C++ 作为 perl 脚本运行,而 perl 将(希望如此!)无法解析。
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
...
<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>
...
</servlet>