如何通过用C编写的cgi-bin程序检索“POST”表单数据

12

我正尝试使用用C语言编写的程序从HTML表单中检索POST数据。

目前我正在使用以下代码:

char *formdata = getenv("QUERY_STRING");
if(formdata == NULL) /* no data retrieved */

看起来这个代码段使用"GET"方法没有问题,但是使用"POST"方法就有问题了。如何获取POST数据?

3个回答

16

POST数据附加在请求头部的双重换行符之后。在CGI-BIN环境中,您可以从STDIN中读取它。

请注意,服务器不需要在POST数据末尾发送EOF字符(或其他终止指示器)。永远不要读取超过CONTENT_LENGTH字节。


14
如果我没记错的话,应该从 stdin 中读取 POST 数据。
编辑未经测试的代码片段。
len_ = getenv("CONTENT_LENGTH");
len = strtol(len_, NULL, 10);
postdata = malloc(len + 1);
if (!postdata) { /* handle error or */ exit(EXIT_FAILURE); }
fgets(postdata, len + 1, stdin);
/* work with postdata */
free(postdata);

谢谢。Stdin似乎可以工作。我甚至从未考虑过使用stdin来做这件事。 - Athabaska Dick

4

6
+1... 但重新发明轮子是学习东西的好方法...也许...某一天...能想出一种不同但更好的方式来做同样的事情 :) (注:+1 在这里表示赞同或同意) - pmg
哎呦,太棒了,pmg!就在昨天,我告诉了一个人:如果你想学习并有时间的话,在有机会时重新发明轮子吧! - salezica
找到一个更好的方法需要对现有的方法非常熟悉 - 需要询问如何检索POST数据的人没有那种熟悉程度。 - Sherm Pendley
2
是的,我明白你的意思,但这个特定项目不需要任何字符解码或其他魔法的支持。即使是应用程序的独立版本也要求输入数据是纯ASCII(仅接受a到z之间的字符)。我还以一种比libcgi更高效和适合我的数据集的方式处理HTML转义代码。Libcgi仅支持转义序列编码和解码以及base64,而我现在都不需要。当处理更多功能的应用程序时,当然可以使用libcgi或类似的库。 - Athabaska Dick
3
只应将“仅链接回答”作为评论发布。而这并不能回答问题。 - bobobobo
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接