cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息

【问题】用c编写cgi程序怎样取出html表单post来的数据?

【分析】html表单post来的数据形如username="zhang"&&password="123456"&&useid="012"

【方法1】lainco

#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

[html] view
plain
copy

  1. char *info=NULL;
  2. char username[64];
  3. char passwd[64];
  4. int userid;
  5. int lenstr=0;
  6. memset(username,0,64);
  7. memset(passwd,0,64);
  8. userid=0;
  9. /*
  10. * Get the data by post method from index.html
  11. */
  12. lenstr=atoi(getenv("CONTENT_LENGTH"));
  13. info=(char *)malloc(lenstr+1);
  14. fread(info,1,lenstr,stdin);

2 将info作为文件流输入。利用sscanf提取子串

[html] view
plain
copy

  1. sscanf(info,"username=%[^&]&passwd=%[^&]&userid=%d",username,passwd,&userid);
  2. free(info);

注:假设数据为实型。则利用sscanf时。要加上&,如上例userid

【思考】假设子串为username=zhang; passwd=123; userid=012,怎样用【方法2】提取?

[html] view
plain
copy

  1. sscanf(info,"username=%[^;]; passwd=%[^;]; userid=%d",&username,&passwd,&userid);

注意:将%[^&]&替换为%[^;];。

通过本例,能够明确%[^;];的使用方法。

【解析】%[^&]是正則表達式,具体请參考:

uid=9195812&do=blog&cuid=499274" style="color:rgb(51,102,153); text-decoration:none">http://blog.chinaunix.net/space.php?uid=9195812&do=blog&cuid=499274

时间: 2024-11-05 13:35:30

cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息的相关文章

黑马程序员--微信公众平台开发中的结合BAE进行IO操作的一些要点

微信公众平台开发中的结合BAE进行IO操作的一些要点进行整理,主要是为了实现图文消息的上传,和用模拟登陆的方式下载客户发送给公众账号的语音消息.图片消息等. package com.weinxin.utils; import com.baidu.inf.iis.bcs.BaiduBCS; import com.baidu.inf.iis.bcs.auth.BCSCredentials; public class BaiduBCSTools { public static String ACCES

Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)

本文将介绍如何在 .NET Core 环境下,借助 SignalR 在小程序内使用 WebSocket.关于 WebSocket 和 SignalR 的基础理论知识不在这里展开,已经有足够的参考资料,例如参考 SignalR 的官方教程:https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-2.1 我们先看一下完成本教程内容后,在小程序内实现的 WebSocket 效果: 私有及群发消息

微信公众平台开发(107) 分享到朋友圈和发送给好友

关键字:微信公众平台 JSSDK 发送给朋友 分享到朋友圈 onMenuShareTimeline onMenuShareAppMessage 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-js-sharetimeline.html 在这篇微信公众平台开发教程中,我们将介绍如何在网页中实现发送给朋友和分享到朋友圈时内容参数自定义的功能. 本文分为以下二个部分: 生成JS-SDK权限验证签名 实现发送给朋友和分享到朋友圈时内容参数自定义 一

微信公众号开发(2)---消息的接收发送

在微信公众号开发(1)中,我们进行了GET请求方法的开发编写,能够使微信与我们的服务器进行了关系的绑定,接下来我们进行开发接收用户消息与一些事件的回复:      开发必要了解:在我们微信与我们的服务器进行了关系的绑定后,微信会将用户所发过来的消息以及事件会以XML的格式以POST请求的方式发送给我们的服务器,所以我们需要开发POST请求的接口,接收用户的消息,我们可以根据用户的消息进行一些关键字回复,以及关注后的回复推送,微信事件里有很多功能,这里只进行开发关键字回复以及关注事件,其他的顺藤摸

微信公众平台开发学习系列(二):微信公众平台接收消息与发送消息

本篇主要介绍如何使用senparc来处理微信公众平台的接收消息与发送消息. 首先微信端会将用户的发送的信息以post请求发送到填写的url上,服务端代码如下: 1 [HttpPost] 2 public ActionResult Get(PostModel postModel) 3 { 4 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel); 5 6 messageHandler.Execut

微信公众号开发(152)——客服消息发送卡券

本文介绍如何使用微信公众平台客服消息发送接口来发送卡券给用户. 一.卡券格式 卡券的json格式如下 { "touser":"OPENID", "msgtype":"wxcard", "wxcard":{ "card_id":"123dsdajkasd231jhksad" } } 其中,msgtype为wxcard,而card_id为卡券 ID 二.代码实现 使用方倍

006-Android程序学习/微信公众平台开发/WordPress

自从发现极客学院之后,我对互联网的兴趣又开始慢慢的长出来了.Android的JAVA基础先学了阵,发现比我想象中的麻烦多了,而且intellij IDEA和Adnroid Studio这两个软件带来的成就感有点差.刚好看极客学院里还有微信公众平台开发的东西,兴趣就转到微信公众平台开发这里来了,昨天晚上看了下 微信公众平台开发快速入门 之后,发现微信公众平台的二次开发并没有我想象中的那么麻烦,因为很多轮子微信开发组的人都给我们做好了,我们要做的只是如何把轮子和零件组装起来.虽说这个和我原来想的编程

微信公众平台小程序开发大牛必备技能

近期在热议微信公众平台小程序,很多程序猿GG们在说不就是网页版的软件么~~~真 是"材"大气粗.然而重点来了~~~程序猿GG们真的会开发么?不要随意吹牛好不好? 接下来,我给程序猿GG们整理了制作小程序的武功秘籍,要知道,H5和JS人才将会很 抢手哟,马上储备技能先~~ 首先,要知道小程序是基于H5开发的,但是用了JS-SDK的框架~~~ 其次,找修炼秘籍~~近乎赠送的价格,给你一身养家本领,还不快快领走~~ 1.    H5精英必备技能: 张伟芝老师的<结合MUI框架完成HTM

微信公众平台-接收消息与发送被动消息

接收消息代码如下(包含回复消息调用): /// <summary> /// 接收用户消息 /// iftrue /// 2014-07-08 /// </summary> public class Receive { public delegate Models.Send_Msg delegate_SendMsg(string msgType); public delegate void delegate_RececiveHandler(Models.Receive_Msg mod