zoukankan      html  css  js  c++  java
  • linux CGI GET POST 入门示例

    CGI编程入门---GET与POST示例

    关于CGI的编程,我也还是新手!但只要懂C,则基于C的CGI编程就不会很难!
    下面就GET和POST方法的应用,做一个小小的demo,给刚学习CGI编程的新手提供一点感性认识!

    GET方法:做一个加法运算,需要接收两个参数。
    文件get.c如下:
    -------------------------------
    #include <stdio.h>
    #include <stdlib.h>
    int main(void)
    {
            char *data;
            char a[10],b[10];
            printf("Content-Type:text/html\n\n");
            printf("<HTML>\n");
            printf("<HEAD>\n<TITLE >Get Method</TITLE>\n</HEAD>\n");
            printf("<BODY>\n");
            printf("<div style=\"font-size:12px\">\n");
            data = getenv("QUERY_STRING");
            if(sscanf(data,"a=%[^&]&b=%s",a,b)!=2){
                    printf("<DIV STYLE=\"COLOR:RED\">Error:Parameters should be entered!</DIV>\n");
            }
            else{
                    printf("<DIV STYLE=\"COLOR:GREEN; font-size:15px; font-weight:bold\">a + b = %d</DIV>\n",atoi(a)+atoi(b));
            }
            printf("<HR COLOR=\"blue\" align=\"left\" width=\"100\">");
            printf("<input type=\"button\" value=\"Back CGI\" onclick=\"javascript:window.location='../cgi.html'\">");
            printf("</div>\n");
            printf("</BODY>\n");
            printf("</HTML>\n");
            return 0;
    }
    gcc -o get.cgi get.c

    将生成的get.cgi cp到cgi-bin中
    POST方法:做一个乘法运算,需要接收两个参数。
    文件post.c如下:
    --------------------------------
    #include <stdio.h>
    #include <stdlib.h>
    int main(void){
            int len;
            char *lenstr,poststr[20];
            char m[10],n[10];
            printf("Content-Type:text/html\n\n");
            printf("<HTML>\n");
            printf("<HEAD>\n<TITLE >Post Method</TITLE>\n</HEAD>\n");
            printf("<BODY>\n");
            printf("<div style=\"font-size:12px\">\n");
            lenstr=getenv("CONTENT_LENGTH");
            if(lenstr == NULL)
                    printf("<DIV STYLE=\"COLOR:RED\">Error:Parameters should be entered!</DIV>\n");
            else{
                    len=atoi(lenstr);
                    fgets(poststr,len+1,stdin);
                    if(sscanf(poststr,"m=%[^&]&n=%s",m,n)!=2){
                            printf("<DIV STYLE=\"COLOR:RED\">Error: Parameters are not right!</DIV>\n");
                    }
                    else{
                            printf("<DIV STYLE=\"COLOR:GREEN; font-size:15px; font-weight:bold\">m * n = %d</DIV>\n",atoi(m)*atoi(n));
                    }
            }
            printf("<HR COLOR=\"blue\" align=\"left\" width=\"100\">");
            printf("<input type=\"button\" value=\"Back CGI\" onclick=\"javascript:window.location='../cgi.html'\">");
            printf("</div>\n");
            printf("</BODY>\n");
            printf("</HTML>\n");
            fflush(stdout);
            return 0;
    }

    gcc -o post.cgi post.c

    将生成的post.cgi cp到cgi-bin中
    再附上html测试文件cgi.html:
    --------------------------------
    <html>
    <head>
    <title>CGI Testing</title>
    </head>
    <body>
    <table width="200" height="180" border="0" style="font-size:12px">
    <tr><td>
    <div style="font-weight:bold; font-size:15px">Method: GET</div>
    <div>Please input two number:<div>
    <form method="get" action="cgi-bin/get.cgi">
    <input type="txt" size="3" name="a">+
    <input type="txt" size="3" name="b">=
    <input type="submit" value="sum">
    </form>
    </td></tr>
    <tr><td>
    <div style="font-weight:bold; font-size:15px">Method: POST</div>
    <div>Please input two number:<div>
    <form method="post" action="cgi-bin/post.cgi">
    <input type="txt" size="3" name="m">*
    <input type="txt" size="3" name="n">=
    <input type="submit" value="resu">
    </form>
    </td></tr>
    <tr><td><input type="button" value="Back Home" onclick='javascript:window.location="./index.html"'></td></tr>
    </table>
    </body>
    </html>

    action="cgi-bin/post.cgi"的目录根据自己的实际目录调整
    几点简要说明:
    (1)printf("Content-Type:text/html\n\n");
    此行通过标准输出将字符串″Contenttype:text/plain\n\n″传送给Web服务器。它是一个MIME头信息,它告诉Web服务器随后的输出是以纯ASCII文本的形式。请注意在这个头信息中有两个换行符,这是因为Web服务器需要在实际的文本信息开始之前先看见一个空行。
    (2)data = getenv("QUERY_STRING");
    CGI定义:当GET方法提交的表单被发送到服务器断后,表单中的数据被保存在服务器上一个叫做QUERY_STRING的环境变量中。这种表单的处理相对简单,只要读取环境变量就可以了。
    (3)sscanf(data,"a=%[^&]&b=%s",a,b)!=2
    这个是关于sscanf函数的使用问题,自己可以上网搜索一下,这里不再详述!
    (4)atoi(a)+atoi(b)
    atoi函数的功能是将字符型成整型,只有转换之后才可以进行加法运算!
    (5)lenstr=getenv("CONTENT_LENGTH");
    Web服务器在调用使用POST方法的CGI程序时设置此环境变量,它的文本值表示Web服务器传送给CGI程序的输入中的字符数目,因此需要使用函数atoi() 将此环境变量的值转换成整数,并赋给变量len(下面有定义)。
    (6)fgets(poststr,len+1,stdin);
    这个是关于fgets函数的使用问题,自己可以上网搜索一下,这里不再详述!

    <form action="./cgipost.cgi" method=post>
    用户名:<input id=name type=text name=username size=20>
    密码:<input id=passwd type=password name=password size=20>
    <input type=submit value="提交">
    </form>

    //cgipost.c -->cgipost.cgi
    我的程序:
    #include <stdio.h>
    #include <stdlib.h>

    void PrintHTMLHeader(){
    printf("Content-type: text/html\n\n");
    printf("<html>\n");
    printf("<head><title>CGI GET/POST test</title></head>\n");
    printf("<body>\n");
    }
    void PrintHTMLFoot(){
    printf("</body>\n");
    printf("</html>\n");
    }
    int main(){
    PrintHTMLHeader();

    char *lenstr = getenv("CONTENT_LENGTH");
    if(lenstr == NULL)
    printf("nothing! <br/>");
    else
    printf("*lenstr = %s <br/>",lenstr);

    PrintHTMLFoot();
    return 0;
    }


  • 相关阅读:
    IdentityServer4学习笔记
    常用链接地址
    c++ 多线程(2000个)端口扫描(附源码)
    C++ 定时器Timer在项目中的使用
    [Under the hood]---Matt Pietrek October 1996 MSJ
    [under the hood]Reduce EXE and DLL Size with LIBCTINY.LIB
    TN035: Using Multiple Resource Files and Header Files with Visual C++
    单文件版本的netframework的net core 2.1
    Dependency Walker的替代品Dependencies
    怎么使用gradle给spring 打thinjar(gradle 7)
  • 原文地址:https://www.cnblogs.com/zzxap/p/2175807.html
Copyright © 2011-2022 走看看