标签:cgi post data 微信公众平台开发
【问题】用c编写cgi程序如何取出html表单post来的数据?
【分析】html表单post来的数据形如username="zhang"&&password="123456"&&useid="012"
【方法1】
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
char* getcgidata(FILE* fp, char* requestmethod);
-
int main()
-
{
-
char *input;
-
char *req_method;
-
char name[64];
-
char pass[64];
-
char userid[64];
-
int i = 0;
-
int j = 0;
-
// printf("Content-type: text/plain; charset=iso-8859-1\n\n");
-
printf("Content-type: text/html\n\n");
-
printf("The following is query reuslt:<br><br>");
-
req_method = getenv("REQUEST_METHOD");
-
input = getcgidata(stdin, req_method);
-
-
for ( i = 9; i < (int)strlen(input); i++ )
-
{
-
if ( input[i] == ‘&‘ )
-
{
-
name[j] = ‘\0‘;
-
break;
-
}
-
name[j++] = input[i];
-
}
-
-
for ( i = 19 + strlen(name), j = 0; i < (int)strlen(input); i++ )
-
{
-
if ( input[i] == ‘&‘ )
-
{
-
pass[j] = ‘\0‘;
-
break;
-
}
-
pass[j++] = input[i];
-
}
-
-
for ( i = 30 + strlen(pass)+ strlen(name), j = 0; i < (int)strlen(input); i++ )
-
{
-
userid[j++] = input[i];
-
}
-
-
userid[j] = ‘\0‘;
-
printf("Your Username is %s<br>Your Password is %s<br>Your userid is %s<br> \n", name, pass,userid);
-
return 0;
-
}
-
char* getcgidata(FILE* fp, char* requestmethod)
-
{
-
char* input;
-
int len;
-
int size = 1024;
-
int i = 0;
-
if (!strcmp(requestmethod, "GET"))
-
{
-
input = getenv("QUERY_STRING");
-
return input;
-
}
-
else if (!strcmp(requestmethod, "POST"))
-
{
-
len = atoi(getenv("CONTENT_LENGTH"));
-
input = (char*)malloc(sizeof(char)*(size + 1));
-
if (len == 0)
-
{
-
input[0] = ‘\0‘;
-
return input;
-
}
-
while(1)
-
{
-
input[i] = (char)fgetc(fp);
-
if (i == size)
-
{
-
input[i+1] = ‘\0‘;
-
return input;
-
}
-
--len;
-
if (feof(fp) || (!(len)))
-
{
-
i++;
-
input[i] = ‘\0‘;
-
return input;
-
}
-
i++;
-
}
-
}
-
return NULL;
-
}
【方法2】
1 先将post来的数据整体读入info
-
char *info=NULL;
-
-
char username[64];
-
char passwd[64];
-
int userid;
-
-
-
int lenstr=0;
-
-
memset(username,0,64);
-
memset(passwd,0,64);
-
userid=0;
-
/*
-
* Get the data by post method from index.html
-
*/
-
lenstr=atoi(getenv("CONTENT_LENGTH"));
-
info=(char *)malloc(lenstr+1);
-
fread(info,1,lenstr,stdin);
2 将info作为文件流输入,利用sscanf提取子串
-
sscanf(info,"username=%[^&]&passwd=%[^&]&userid=%d",username,passwd,&userid);
-
free(info);
注:如果数据为实型,则利用sscanf时,要加上&,如上例userid
【思考】如果子串为username=zhang; passwd=123; userid=012,如何用【方法2】提取?
-
sscanf(info,"username=%[^;]; passwd=%[^;]; userid=%d",&username,&passwd,&userid);
注意:将%[^&]&替换为%[^;];。通过本例,可以明白%[^;];的用法。
【解析】%[^&]是正则表达式,详细请参考:
http://blog.chinaunix.net/space.php?uid=9195812&do=blog&cuid=499274
cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息
标签:cgi post data 微信公众平台开发
原文地址:http://blog.csdn.net/nyist327/article/details/40395779