十分钟搞懂什么是cgi

叶祖辉 叶祖辉     2022-08-31     250

关键词:

原文: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方法:

我找了一个很好的资料,很短,一路了然: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服务器,敬请期待!

五分钟搞懂vuex(代码片段)

...画瓢使用,但是总有一种朦朦胧胧的感觉。于是决定彻底搞懂它。看了一下午的官方文档,以及资料,才发现vuexsoeasy!作为一个圈子中的人,决定输出一下文档,如果你仔细看完这篇文章,保证你对vuex熟练掌握。 我把自己... 查看详情

五分钟搞懂mysql索引下推(代码片段)

大家好,我是老三,今天分享一个小知识点——索引下推。如果你在面试中,听到MySQL5.6”、“索引优化”之类的词语,你就要立马get到,这个问的是“索引下推”。什么是索引下推索引下推(IndexConditionPushdown&... 查看详情

五分钟搞懂mysql索引下推(代码片段)

大家好,我是老三,今天分享一个小知识点——索引下推。如果你在面试中,听到MySQL5.6”、“索引优化”之类的词语,你就要立马get到,这个问的是“索引下推”。什么是索引下推索引下推(IndexConditionPushdown&... 查看详情

3分钟带你搞懂selenium工具和自动测试框架

 一、什么是Selenium?Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:SeleniumIDE、SeleniumWebDriver和SeleniumGrid。SeleniumIDE:Firefox的一... 查看详情

5分钟搞懂布隆过滤器,掌握亿级数据过滤算法(代码片段)

...农在新加坡】,欢迎关注。个人博客网站:5分钟搞懂布隆过滤器,掌握亿级数据过滤算法布隆过滤器是什么本质上布隆过滤器(BloomFilter)是一种数据结构,比较巧妙的概率型数据结构(probabilisticdatastructure)... 查看详情

3分钟带你搞懂es6import和export

如下语句是 defaultimport://B.jsimportAfrom‘./A‘且只在A存在 defaultexport 时生效://A.jsexportdefault42这种情况下你用import语句,随便取什么名字都没关系://B.jsimportAfrom‘./A‘importMyAfrom‘./A‘importSomethingfrom‘./A‘因为他最终 查看详情

5分钟搞懂丨2021年爆火的“元宇宙”概念是什么,应用场景有哪些

元宇宙(Metaverse)是什么,底层技术构成是什么,是否是骗局?这个单词出自1992年的一篇科幻小说《雪崩》,小说里的人类可以使用VR设备在一个虚拟空间与虚拟人一同生活。本月28日,Facebook(脸... 查看详情

五分钟搞懂vuex(代码片段)

...画瓢使用,但是总有一种朦朦胧胧的感觉。于是决定彻底搞懂它。看了一下午的官方文档,以及资料,才发现vuexsoeasy!作为一个圈子中的人,决定输出一下文档,如果你仔细看完这篇文章,保证你对vuex熟练掌握。 我把自己... 查看详情

搞懂异地多活,看这篇就够了

阅读本文大约需要20分钟。你好,我是Kaito。在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理。异地多活到底是什么?为什么需要异地多活?它到底解决了什么问... 查看详情

10分钟搞懂vitedevserver,速来围观!(代码片段)

分析version:2.2.3,和我来一场viteserver探寻之旅吧~(❦ω❦)一、初始cli启动服务做了什么?pacakge.json的bin指定可执行文件:"bin":     "vite": "bin/vite.js"  在安装带有bin字段的vite包,那可执行... 查看详情

十分钟搞懂elasticsearch数字搜索原理(代码片段)

原文:十分钟搞懂Elasticsearch数字搜索原理更多精彩内容请看我的个人博客或者扫描二维码,关注微信公众号:佛西先森前言Elasticsearch诞生的本意是为了解决文本搜索太慢的问题,ES会默认将所有的输入内容当作字符串来理解,对... 查看详情

10分钟搞懂!消息队列选型全方位对比

导语 | 消息队列是分布式系统中重要的中间件,在高性能、高可用、低耦合等系统架构中扮演着重要作用。本文对Kafka、Pulsar、RocketMQ、RabbitMQ、NSQ这几个消息队列组件进行了一些调研,并整理了相关资料,为业务对MQ中间... 查看详情

两分钟搞懂函数提升与变量提升

参考技术A先不讲官方对“函数提升”与“变量提升”的定义,请回答我俩问题:这里弹出“1”,应该是没什么问题吧?那么再看看下面这个:相信很多同学会说,这里也是弹出1,没错,答案确实是1。那么我顺便就告诉你,上... 查看详情

搞懂异地多活,看这篇就够了

阅读本文大约需要20分钟。在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理。异地多活到底是什么?为什么需要异地多活?它到底解决了什么问... 查看详情

搞懂异地多活,看这篇就够了

阅读本文大约需要20分钟。在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理。异地多活到底是什么?为什么需要异地多活?它到底解决了什么问... 查看详情

最简明的systemd进程管理教程,搞懂只需10分钟~(代码片段)

systemd介绍systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。所以从Cent... 查看详情

一分钟搞懂与或非异或优先级!

¬(非)和∧(异或)优先级高,因为他们是单运算符。&(与)和∣(或)优先级低,因为他们是双运算符,就是说需要两边都有数据才能运算。给个网图(侵删)自己好好... 查看详情

5分钟搞懂:session与cookie(代码片段)

http是无状态协议无状态协议的意思是服务端与客户端不会记录任何一次通信的信息。诺兰有一部电影《记忆碎片》,说的是一个有“短期记忆丧失症”的人根据自己支离破碎的记忆来找到杀害自己妻子的凶手的故事。因为记不... 查看详情