@原创文章,转载请注明: 转载自 镜中影的技术博客
本文链接地址: 网站交互的理解)
URL:http://blog.youkuaiyun.com/linkpark1904/article/details/50790963
在工作室摸爬滚打了许久,对于网站开发还是有部分自己的心得与体会,虽然在工作室的主要职责是负责前台部分的开发以及运维等等,但是了解的方面多了之后,才发现,计算机整个学科有许多东西都是通的,有很多共同的部分,只是,一开始我们每个人的出发点和侧重点有所不同,但深入下去,必然会有交集的。
HTTP协议
http协议其实很简单,所谓协议,说白了,就是客户与服务器之间通信交流的桥梁,客户机需要服务器做些什么动作,那么就会发送一串按照既定规则编写的消息给服务器,服务器解析这则消息,同样的根据既定的规则,将回复消息回复给客户,完成客户机与服务器的通信。那么这个既定的规则就是我们的协议。
HTTP协议其实很简单,总共也就四种方法,GET,POST,PUT,DELETE。REST风格协议,不会维持客户端与服务器的状态,每次发送一条新的消息的时候就会发起一次TCP连接。一条典型的get方法的http协议如下所示:
GET / HTTP/1.1
Host: xkcd.com
Accept: text/html
User-Agent: Mozilla/5.0 (Macintosh)
相应的,服务器端在收到之后回复给客户端的协议如下:
HTTP/1.1 200 OK
Date: Sat, 02 Apr 2011 21:05:05 GMT
Server: lighttpd/1.4.19
Content-Type: text/html
<html>
<!--html for xkcd.com-->
</html>
就是这样的你来我往,造就了我们的web服务器,据说,早先的web服务器还真就只是这个版本,网站管理员只是在后台发布html静态页面,客户端通过浏览器网址(url)来访问这些静态页面的内容,获取相应的信息,并没有今天这么多的交互。
CGI
CGI(Common Gateway Interface),公共网关接口,看起来很高端大气上档次吧。C、G、I三个字母组成起来到底是个啥玩意儿。没关系,我们网站发展的业务需求上来看CGI产生的原因。
前面说了,早先的web服务器仅仅只是提供静态页面给用户来看,但是许多用户有这样的需求:1、我需要对这篇文章进行评论。2、我需要在线下发布自己的文章内容。3、我需要注册网站账号……这样一系列的交互式的需求,在静态页面中是做不到的。
还记得http协议中有所谓的post方法吧,post方法语义是Create a resource on the server,也就是向服务器端提交资源。那么上述这些需求,是可以实现的,但是web服务器的功能仅是提供静态页面,没办法支持这些复杂的功能,于是为了丰富我们的webserver的功能,webserver在设计的时候就留了这样的一个接口,也就是CGI,说白了,CGI就是连接webserver和我们自己应用程序的标准接口,是保证webserver和外部应用程序通信的数据管道。
举个例子,像我们的平常所做的登陆流程,实际上,我们在写完用户名和密码之后,通过http的post方法,将我们的用户名密码通过http协议封装提交到服务器,服务器通过url字段判断这个消息需要发送给后面运行的哪个应用程序进行处理,于是就通过CGI,将这个协议丢给相应的应用程序做处理,应用程序做完之后,生成相应的静态html,通过CGI丢给webserver,webserver再展现给客户端,于是整个流程就完了。
举个很简单的例子,在前台,我们的form表单上可能会这么写:
<form action="index.php">
<input name="name" type="text" />
<input name="passwd" type="password" />
<input type="submit">
</form>
这个时候这个action字段里面就提供了我们的应用程序index.php这个php脚本,我们的数据会提交给这个脚本进行处理,相应的,在后台,我们的index.php这个脚本可以这么写
<?php
$name = $_POST["name"];
$passwd = $_POST["passwd"];
print $name;
print passwd;
?>
简单的将你的用户名密码打印出来,生成html页面,通过CGI反馈给webserver,webserver再反馈给用户,具体流程可以看看下面这个图:
这样就丰富了我们的webserver的功能,当然,这里仅仅只列举了php这门脚本语言来实现CGI这个接口,能够实现CGI接口的语言很多,python呀,java呀,ruby呀之类的,甚至连c语言也能够办到,但语言不是问题,关键还是在思想。通过这些语言扩展的页面就是所谓的动态页面,能够根据执行一定的业务逻辑,生成用户想要的静态页面。