cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息
【问题】用c编写cgi程序怎样取出html表单post来的数据?
【分析】html表单post来的数据形如username="zhang"&&password="123456"&&useid="012"
#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);
注意:将%[^&]&替换为%[^;];。
通过本例,能够明确%[^;];的使用方法。
【解析】%[^&]是正則表達式,具体请參考:
cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息的更多相关文章
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)
本文将介绍如何在 .NET Core 环境下,借助 SignalR 在小程序内使用 WebSocket.关于 WebSocket 和 SignalR 的基础理论知识不在这里展开,已经有足够的参考资料, ...
- 微信公众平台开发教程Java版(三) 消息接收和发送
https://www.iteye.com/blog/tuposky-2017429 前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送 可以先了解公众平台的消息api接口(接收消息, ...
- C# 微信公众平台开发(3)-- 接受/发送消息
1.接收事件 关注/取消关注事件: 用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL. 通过微信返回的XML,我们通过代码 就可以作相应的处理: 先获取返回的信息: if (Ht ...
- 使用Java语言开发微信公众平台(四)——图文消息的发送与响应
在上一篇文章中,我们实现了被关注回复与关键词回复功能.在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息.但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起 ...
- 沐雪多用户微信公众平台开发源码,商城小程序源码(2018年最新的asp.net C# 微信源码,小程序源码)
现售价5400元,就可以搭建自己的微信平台啦 购买地址:https://item.taobao.com/item.htm?id=539102325336 该系统是由[上海沐雪网络]独家授权销售,其他地 ...
- JAVA微信公众号通过openid发送模板消息~
1,问题产生 在微信公众号开发过程中,我们有时候做不同权限的时候,比如在注册的时候,需要审核,然后我们要想办法让对方知道审核的结果.这时候我们可以通过模板消息来通知. 2,第一步,首先在微信公众号上获 ...
- .Net程序员关于微信公众平台测试账户配置 项目总结
今天项目第一次验收,夜晚吃过晚饭后,想把项目中用到的关于微信配置总结一下,虽然网上关于这方面的资料很多很多,还有官方API,但是总感觉缺点什么,就像期初做这个项目时,各方面找了很久的资料,说说配置吧! ...
- 微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint
微信公众号开发自从支持允许在群发图文中插入小程序,方便了小程序的运营及推广.最近在三方服务开发中,要支持图文素材插入小程序遇到了一个很是棘手的问题.官方给出的插入小程序的示例支持文字.图片.卡片.如下 ...
- odoo发送信息到微信公众平台、企业微信
目录 odoo发送信息到微信 @(odoo client.message.send_text) odoo发送信息到微信 在odoo平台中进行项目开发的时候有时会用到跟其他平台对接发送信息. 这里我写一 ...
随机推荐
- Jmeter之计数器
如果需要引用的数据量较大,且要求不能重复或者需要自增,那么可以使用计数器来实现. 计数器(counter):允许用户创建一个在线程组之内都可以被引用的计数器. 计数器允许用户配置一个起点,一个最大值, ...
- 创建一个TCP服务器端通信程序的步骤
创建一个TCP服务器端通信程序的步骤: 1). 创建一个ServerSocket 2). 从ServerSocket接受客户连接请求 3). 创建一个服务线程处理新的连接 4). 在服务线程中,从so ...
- nginx报错:Permission denied
vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉 SELINUX=disabled #增加 :wq! ...
- 微服务网关从零搭建——(七)更改存储方式为oracle
资源准备: 下载开源项目 新建oracle表: -- ---------------------------- -- Table structure for OcelotGlobalConfigura ...
- TestNG安装及配置
1. 在idea中新建一个maven项目 2. 在pom.xml中添加testng和reportng依赖 <dependencies> <!-- 添加testNG依赖 --> ...
- Libreswan软件的密钥协商协议IKEv1主模式实现分析
Libreswan软件的密钥协商协议IKEv1主模式实现分析 1 协商过程 IKEv1(互联网密钥交换协议第一版)是IPsec VPN隧道协商使用的标准密钥协商协议,其协商过程如下图所示. 总共来回交 ...
- ubuntu_linux自动补全出现问题
问题:输入: cd p,使用Tab补全,期望进入pub_work目录,虽然自动补全,成功进入目录:却给我打印一连串的字符,纠结: fly@Flyme:~$ cd p+ local cur prev w ...
- Windows窗口创建的具体步骤
/*实现窗口创建的六步骤:第一步:创建入口函数WinMain第二步:注册窗口类第三部:实现回调函数的功能第四步:显示窗口第五步:更新窗口第六步:消息循环*/ #include "stdafx ...
- CodeForcesGym 100753F Divisions
Divisions Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForcesGym. Or ...
- JAVA之中出现无法加载主类的情况解决方法
j今天打代码的时候出现了无法加载主类的情况,我就收集了一些,java无法加载主类的方法 ava无法加载主类解决办法 今天启动项目,又遇到找不到或无法加载主类的情况,清除项目后无法编译,class文件下 ...