原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解。不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧。

CGI真的很简单

在此之前,你或许听说过很多说CGI‘晦涩难懂’的言论。如果你会写最基本的输入输出,那么你就可以写出一个CGI脚本。如果你已经是一个程序员,你只需要几分整就可以明白CGI到底是个什么东西。如果你还不是一个名程序员,对不起这篇文章不是很适合你,你可以先去学习一些编程的知识,例如脚本语言或者shell编程。但你学完了这些,再回过头来看!那么让我们开始吧!

这篇文章是写一个CGI脚本用于处理HTML提交的表单。虽然跳过了一些细节,但是可以让你在短时间内搞明白。

什么是CGI?

CGI不是一门编程语言。它是网页的表单和你写的程序之间通信的一种协议。可以用任何语言写一个CGI脚本,这些语言只要能接收输入输出信息,读取环境变量。所以,几乎所有的编程语言都能写一个CGI脚本,例如:python(把我大python放在第一个!),C,甚至是shell脚本。

CGI脚本的结构

典型的CGI脚本做了如下的事情:

  1. 读取用户提交表单的信息。
  2. 处理这些信息(也就是实现业务)。
  3. 输出,返回html响应(返回处理完的数据)。
    下面主要解释,第一步和最后一步

读取用户提交的表单

当用户填写完表单,点击提交按钮的时候。CGI脚本接收用户表单的数据,这些数据都是k-v的集合的形式(也就是python中的字典)。这里有写实现的例子:python

如果你已经通过上面的例子看懂了,下面的就可以忽略了。如果你还有些不懂请看下面来那两个长的字符串。

  • “name1=value1&name2=value2&name3=value3”
  • "name1=value1;name2=value2;name3=value3"

区别就是:‘&’和‘;’这两个符号,他们的作用都是分隔参数。下面还有两件事情要做。

  1. 把所有的‘+’变成‘空格’
  2. 把所有的符号都转译成‘%xx’样式的符号,例如:‘%3d’转化成‘=’

这样做是为了统一用户的输入,使用统一的URL-encoded进行转译。

那么你从哪里得到这些转译完的字符串呢?根据提交时的时候选用的是什么HTTP方法:

  • GET方法,环境变量是通过URL来传递的,例如:我google‘URL encoded’ 点击搜索提交的请求就是: https://www.google.co.jp/search?q=URL+encoded(我省略其他一些干扰项,注意‘空格’转化成了‘+’
  • POST方法,通过HTTP消息主体传递的。注意:POST方法编码类型有:application/x-www-form-urlencoded 或 multipart/form-data。

我找了一个很好的资料,很短,一路了然:POST对比GET方法

总结:CGI接收的用户数据,是通过http协议传递过来的。而选用不同的‘Method’:GET或POST对CGI的接收没有任何影响。这段是让你明白:数据是怎么通过http协议传输的。

发送响应(Response)返回给用户

首先,第一行要写:Content-type: text/html

新起一行,用于输出数据。写好HTML响应页面。这个页面是:当你的脚本处理完数据后,返回给用户的结果。

是的,你可以随意编写返回的HTML代码。HTML很简单,而且方便。

我的总结

CGI是一种通信协议,它把用户传递过来的数据转变成一个k-v的字典。这个字典中不光有用户的数据,还有HTTP协议的参数。它做的就是把数据,组织成一个固定结构形式的数据。方便任何符合CGI协议的程序都可以调用!但是CGI不是负责通信(传输数据)的,通信的话是通过socket,也就是server,例如上面例子中,是通过Apache进行通信。之后调用CGI脚本,把数据转变成符合CGI协议的数据结构,用于后面的数据处理!

这个系列文章完成后,后面还有一个实战系列。从头写一个web服务器,敬请期待!

转载于:https://www.cnblogs.com/xueweihan/p/5319893.html

十分钟搞懂什么是CGI相关推荐

  1. html网页和cgi程序编程,十分钟搞懂什么是CGI

    原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...

  2. python中cgi到底是什么_十分钟搞懂什么是CGI(转)

    原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...

  3. python数据分析建模-十分钟搞懂“Python数据分析”

    原标题:十分钟搞懂"Python数据分析" 引言:本文重点是用十分钟的时间帮读者建立Python数据分析的逻辑框架.其次,讲解"如何通过Python 函数或代码和统计学知 ...

  4. pearsonr() python_十分钟搞懂“Python数据分析”

    引言:本文重点是用十分钟的时间帮读者建立Python数据分析的逻辑框架.其次,讲解"如何通过Python 函数或代码和统计学知识来实现数据分析". 本次介绍的建模框架图分为六大版块 ...

  5. 十分钟搞懂JSON(JSON对象---JSON字符串---对象 之间的区别)

    好记性不如烂笔头,相信我,看了之后你会彻底搞懂JSON 前言:前天被JSON对象,JSON字符串,JAVA对象搞混了,不知道各自代表的意思,我就查了资料,总结为一篇博文. 另外我想List<Us ...

  6. 十分钟搞懂基-2 FFT原理及编程思想

    0.写在最前 写本文的目的一是为了帮人理清FFT算法思路,二是有几个疑问(在5总结部分提到)希望得到解答.看懂本文的基础:至少听说过.简单了解过傅里叶变换.离散傅里叶变换(DFT).基于时间抽取的基2 ...

  7. 干货!十分钟搞懂消息队列的选型

    大家好,我是程序员史迪仔. 消息队列重要吗?有必要学吗?当然重要! 想必你在面试或者工作的过程中,被问过以下问题: (1)为什么你们项目要用消息队列? (2)用了消息队列后有什么好处? (3)消息队列 ...

  8. 十分钟搞懂手机号码一键登录

    手机号码一键登录是最近两三年出现的一种新型应用登录方式,比之前常用的短信验证码登录又方便了不少.登陆时,应用首先向用户展示带有本机号码掩码的授权登录页面,用户点击"同意授权"的按钮 ...

  9. 十分钟搞懂Java限流及常见方案

    点击关注公众号:互联网架构师,后台回复 2T获取2TB学习资源! 上一篇:Alibaba开源内网高并发编程手册.pdf 文章目录 限流基本概念 QPS和连接数控制 传输速率 黑白名单 分布式环境 限流 ...

最新文章

  1. 专栏 | 李航教授展望自然语言对话领域:现状与未来
  2. java操作mongodb基础(查询 排序 输出list)
  3. 4.11-固件映像包 ( FIP:Firmware Image Package )简介
  4. 批处理之判断文件是否存在
  5. 职业生涯起步不要去顶级公司
  6. MySQL自动建立集合自动分片_1.mongodb初步使用总结
  7. Ubuntu怎么从图形桌面切换到命令行界面
  8. mysql sql delete语句_SQL Delete语句
  9. python爬虫淘宝视频_python爬虫视频教程:一篇文章教会你用Python爬取淘宝评论数据...
  10. 多元统计分析及R语言建模(第四版)--第二章多元数据的数学表达式及R使用课后习题
  11. 为什么浏览器要阻止跨域
  12. dnf服务器系统,可以挂dnf的云服务器
  13. Linux加密框架 crypto 哈希算法说明 同步哈希shash_alg | 异步哈希 ahash_alg | 通用部分抽象 hash_alg_common
  14. Android闹钟程序
  15. 分布式数据库NoSQL(五)——MongoDB 之滴滴、摩拜都在用的索引
  16. 百度身份证认证一直失败
  17. 阿里天池新人赛——幸福感挖掘
  18. 迅为iTOP6818开发板QtE5.7应用例程源码
  19. shell清除cach
  20. linux指令查询ip地址

热门文章

  1. ntdll.dll和ntoskrnl.exe中的NT*和ZW*函数区别
  2. CF - 741(C. Arpa’s overnight party and Mehrdad’s silent entering) 二分图构造
  3. java中ftp删除文件,Java 实现ftp 文件上传、下载和删除
  4. [NOTE] SQLite基础及注入相关
  5. 数据处理之判断值是否为nan(空值)记录
  6. python常见的文件操作:打开、创建等
  7. 重载和const形参
  8. 全局稳定性收敛平衡点为0吗_神经网络的稳定性阐明.pdf
  9. 3分钟学会Linux管道符与重定向
  10. 关于优酷开放SDK相应的mediaplayer的监听器的设置之setOnBufferingUpdateListener