首先是web编程的必备知识:HTTP协议。超文本传输协议(HTTP),是一种通信协议,按照定义来直接去看容易一头雾水,但其实只需要了解:web服务器和客户端之间交流,必须要遵守统一的规矩,不然就跟你说汉语我说英文一样,互相不知对方在说什么。这个统一的规矩或者格式就是HTTP协议
而服务器和客户端之间的通信方式简而言之就是,客户端给服务器发了一个请求(request),服务器要根据这个request的内容来返回客户端要的东西(response),其他要学习的一切东西都是将这个过程变得更加细化和完备的过程。
从我们平时上网的过程来看,发生了如下的事情:
首先,我们在地址栏里输入了一个url: https://movie.douban.com:443/top250?start=25&filter=
它可以被解析分解为如下的部分:
https
这是我们指定的通信协议,通常有http/https。https是http协议的安全版本,是加密的。
movie.douban.com
这是服务器的主机ip地址(但是其实我们一般看见的都是域名,因为ip地址不好记,所以拿域名指代它。我们输入域名后,电脑会自动到一个叫DNS服务器的地方去查这个域名对应的ip地址)
443
这是指定的服务器端口,与host部分用冒号:分开。http默认80端口,https默认443端口,默认的端口一般不用填写
/top250
这是路径path,指定的是在这个服务器上你需要的文件存放的位置,跟电脑里文件夹的路径是一个道理
start=25&filter=
这是url里传的参数,与path用问号?分隔,它内部的每个参数之间用&符号分隔。(start=25,filter=这样的一对一对的就是“属性=参数”这样的格式,url里传的参数都是用的GET方法,之后会讲到)
嗯。。现在浏览器拿到了我输入的url,它就会解析(解析过程之后讲)我给的这个url,知道了我要拿到指定位置文件的需求。就会给服务器发一个request(是二进制字符串):
’GET /top250?start=25&filter= HTTP/1.1\r\nhost:movie.douban.com\r\n\r\n’
其实它是这样的:
GET /top250?start=25&filter= HTTP/1.1
Host: movie.douban.com
看见的这两行是request请求最基本的部分叫请求行,其实浏览器实际发送request的还有很多东西(
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
......略......
)
等等等等一大堆东西,这些是头部header,不过这都是一些浏览器自身对服务器提的细枝末节的要求,我们现在没必要了解
而以上的这些请求行和头部,其实都在上边那个request二进制字符串里,在最后的那\r\n\r\n之前 。请求行和头部完了之后,会有一个\r\n\r\n,表示这里要空一行出来。之后,会再跟上一块内容,叫body。body里存的是通过POST方法提交的参数,这个之后会讲。
以上就是request的全部内容,浏览器把这个request发给了服务器,服务器接收到request,然后拿去解析(解析过程之后讲),解析完之后按照request里的要求,拿出相应的数据,用html模板装好(静态页面直接返回指定文件就好),这一部分就会成为response的body体。response和request的结构一样,都是由 请求行/响应行 + header + 空行 + body组成的。
服务器回复的response如下:
HTTP/1.1 200 OK
这是响应行,后边还有其他一大堆东西(
Date: Sun, 12 Jun 2016 12:06:21 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=30
Vary: Accept-Encoding
X-Xss-Protection: 1; mode=block
.......略......
)
这些是resopnse的头部header,他们同样暂时不用了解,只要知道200 是状态码,OK是对于状态码的解释就行了。一般状态码的含义为:200+代表正常,300+代表正常但是需要跳转,400+500+都是出错了,具体的可以细查。
然后服务器把由响应行 + 头部header + 体body组成的response发回给客户端。客户端把接受到的response解析,拿出body体里的内容加载出来,就是我们可以看到的页面了。
以上就是整个从访问到浏览器显示结果的的整个过程的文字描述,接下来我举例分析就其中的关键步骤对应的一些代码:
代码是用python的socket模块来实现的,浏览器(客户端)和服务器之间的联系方式用语言表述如下:
步骤一:服务器会监听自己的一个端口port,并且将自己的主机ip地址和端口通过其他方式告知浏览器。(就比如我们是事先知道豆瓣电影的url的)
步骤二:浏览器知道ip和port之后,就会向这个位置发送连接请求
步骤三:服务器接收连接请求,至此两者之间的通信就已经建立,互相之间可以互相发送数据了
这是客户端:
这是服务器端:
至此,关于从客户端到服务器再到客户端,我们传递参数获取页面的整个过程的基本原理已经从底层到框架完全展示了一遍,虽然例子很简单,但是核心很完整。
整个后端程序其实就是,接受从网传来的请求,提交的数据等其他一系列信息,然后在后端代码里解析,然后根据不同的需要,有的要存数据库,有的要表现出来,还有的要从数据库里拿东西 ,然后把需要表达的东西组合起来放到容器里传给模板,模板按照其语法从容器里获取对应的数据,然后表现出来。
只不过规模和复杂程度比这几个例子要大很多很多倍,但是掌握了原理,再去理解一些细节的东西,就很清楚了。
网友评论