十分钟搞懂什么是CGI

原文: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服务器,敬请期待!

时间: 2024-12-29 04:09:04

十分钟搞懂什么是CGI的相关文章

十分钟搞懂什么是CGI(转)

原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真的很简单 在此之前,你或许听说过很多说CGI‘晦涩难懂’的言论.如果你会写最基本的输入输出,那么你就可以写出一个CGI脚本.如果你已经是一个程序员,你只需要几分整就可以明白CGI到底是个什么东西.如果你还不是一个名程序员,对不起这篇文章不是很适合你,你可以先去学习一些编程的知识,例如脚本语言或者sh

【白话篇】10分钟搞懂字符编码

如上图所示为常见的,让人看了头晕的 几个种编码. 看懂下面几条规则,你就明白他们的关系了. [1]有些人说,GBK严格来说是字符集,而utf-8则是编码,这种区分已经相当模糊了,他们都是"字节到字符的映射关系",所以下面都用编码来说吧. [2] ISO-8859-1 这种编码是单字节编码,衍生于ASCII,表示范围0-255,只要按照ASCII的规则设计的编码,不管是几字节的,都可以和ISO-8859-1兼容. [3]比如说,GBK编码(双字节)能转化成ISO-8859-1编码,是因为

3分钟搞懂曝光直方图(转)

3分钟搞懂曝光直方图 原文地址  http://www.fsbus.com/danfanrumen/24880.html 新手上路时,总是会问某张照片要用怎样的曝光参数,不过拍摄环境和光线随时在变,与求人不如求己!除了学会光圈.快门.ISO,还要知道照片怎样才算是恰当曝光.新手不担心难以决定曝光量是否恰当,因为数码相机的直方图(Histogram),就是判断曝光的好帮手. 这就是直方图,新手们刚看到这个都是懵的,这个起伏高低的是什么? 其实就是照片像素的明暗分布(Brightness Value

花10分钟搞懂开源框架吧 - 【NancyFx.Net】

原文:花10分钟搞懂开源框架吧 - [NancyFx.Net] NancyFx是什么? Nancy是一个轻量级的独立的框架,下面是官网的一些介绍: Nancy 是一个轻量级用于构建基于 HTTP 的 Web 服务,基于 .NET 和 Mono 平台,框架的目标是保持尽可能多的方式,并提供一个super-duper-happy-path所有交互. Nancy 设计用于处理 DELETE, GET, HEAD, OPTIONS, POST, PUT 和 PATCH 等请求方法,并提供简单优雅的 DS

十分钟弄懂:数据结构与算法之美 - 时间和空间复杂度

复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半了. 1. 什么是复杂度分析 ? 数据结构和算法解决是 "如何让计算机更快时间.更省空间的解决问题". 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能. 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度. 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系. 2. 为什么要进行复杂度分析 ? 和性能测试相比,复杂度分析有不依赖执行环境.成本低.效率高.易操作.

01. SpringCloud实战项目-五分钟搞懂分布式基础概念

SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. PassJava 是一款Java面试刷题的开源系统,可以用零碎时间利用小程序查看常见面试题,夯实Java基础. PassJava 项目可以教会你如何搭建SpringBoot项目,Spring Cloud项目 采用流行的技术,如 SpringBoot.MyBatis.Redis. MySql. Mon

10分钟搞懂:亿级用户的分布式数据存储解决方案!

分布式数据库和分布式存储是分布式系统中难度最大.挑战最大,也是最容易出问题的地方.互联网公司只有解决分布式数据存储的问题,才能支撑更多次亿级用户的涌入. 接下来,你将花费十分钟掌握以下三方面内容:1.MySQL复制:包括主从复制和主主复制:2.数据分片:数据分片的原理.分片的方案.分片数据库的扩容:3.数据库分布式部署的几种方案. 一.MySQL复制 1.MySQL的主从复制MySQL的主从复制,就是将MySQL主数据库中的数据复制到从数据库中去. 主要目的是实现数据库读写分离,写操作访问主数据

十分钟看懂云计算概念

亚马逊AWS.微软Azure.阿里Aliyun组成的3A团队连续多季度保持高速增长.AWS通过光环新网实现商用,IBM Bluemix则由世纪互联提供运营,国际云服务商陆续来了.Openstack发布Newton版本,看上去就没有不能支持的东西,私有云的春天真的来了吗?Docker红得发紫,与之对应的DevOps和NoOps持续高温.但是对于不少企业尤其是传统企业,云仍在天边,对于云仍感觉云里雾里.上云还是不上云,上什么云,这是个问题.我们试着用最通俗的比喻,理清云服务中最基本的那些事儿. 什么

【Python语言】十分钟搞定pandas

本文是对pandas官方网站上<10 Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯上,我们会按下面格式引入所需要的包: 一.            创建对象 可以通过 Data Structure Intro Setion 来查看有关该节内容的详细信息. 1.可以通过传递一个list对象来创建一个Series,pandas会默认创建整型索引: 2.通过传递一个numpy array,时间索