- 基础原理
- Request 请求
- 请求格式
- 请求方式
- GET 请求
- POST 请求
- 请求头
- Response 应答(响应)
- 应答格式
- 响应状态码
- 响应头
- 页面渲染
- 服务器渲染
- 浏览器渲染
我们通过浏览器浏览一个网站,其具体的流程是这样的:
- 浏览器向 URL 发送 HTTP 请求
- 服务器接收到请求,查看请求内容
- 根据请求内容准备数据
- 将数据以 HTTP 应答形式发回
- 浏览器收到应答,分析应答内容
- 根据应答内容渲染并呈现页面
- 用户进行操作
- 浏览器判断用户的操作,是发送给页面脚本处理还是发送回服务器处理
大致流程是这样的,但是具体上还有许多需要处理的细节,比如说URL的域名解析、HTTP的三次握手等。基于 HTTP 的网络编程大概的流程也是这样,所以 HTTP 请求和 应答是十分重要的部分。
Request 请求request 请求是 HTTP 协议对服务端发送的一种特殊报文形式
请求格式请求信息由3部分构成:
- 请求行:请求方法 URL 协议/版本
- 请求头:请求报文头部(Request Header)信息,放置一些给服务器使用的附加信息
- 请求体:请求正文
GET /sample.Jsp HTTP/1.1 Accept:image/gif.image/jpeg,** 能够接受所有类型
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive :当一个网页打开后,TCP连接不会关闭。如果再次访问服务器上的网页,会继续使用这一条连接
Connection: close :当 Request 完成后,立刻关闭 TCP 连接。
Cache-Control: private :响应只能够作为私有的缓存,不能在用户间共享
Cache-Control: public :响应会被缓存,并在多用户间共享。正常情况下,如果要求 HTTP 认证,则响应会自动设置为 private
Cache-Control: must-revalidate :响应在特定条件下会被宠用,以满足接下来的请求,但是它必须到服务端去验证是不是仍是最新的
Cache-Control: no-cache :响应不会被缓存,而是实时向服务器端请求资源
Cache-Control: max-age=10 :设置缓存最大的有效时间,单位秒
Cache-Control: no-store :在任何条件下,响应都不会被缓存,且不会被写入到客户端的磁盘里。基于安全考虑的某些敏感响应会使用
Range: bytes=0-5 :指定第一个字节的位置和最后一个字节的位置,告诉服务端想要获取的部分。
Response 是服务器对于 request 请求的回答,称为应答或响应
应答格式类似请求信息的格式,应答信息也分为三部分:
- 状态行:协议 状态码 状态信息
- 响应头:响应报文头部(Response Header)信息,放置一些给客户端使用的附加信息
- 响应体:服务器返回的客户端真正要用的内容,例如 html,json 等
HTTP/1,1 200 OK Connection: keep-alive Content-Encoding: gzip Content-Type: text/html;charset=utf-8
应答状态行为第一行,协议、状态码、状态信息使用空格分开。响应头为第二行至空行上一行,格式同请求头使用键值对格式。响应正文为空行下方所有。
响应状态码具体的状态码和含义可以看这里:
响应头HTTP请求状态码
响应头部信息写了一些发送给客户端的需要使用到的信息。常用的响应头信息有:
- Cache-Control : 对应请求头的 Cache-Control
- Content-Type : 回发资源文件的类型和字符编码,客户端根据这里的信息进行解码和解析。对应请求头的 Accept 。格式为 Content-Type: text/html;charset=UTF-8
- Content-Encoding :回发数据的编码(压缩)格式,对应请求头的 Accept-Encoding
- Date :服务器发送资源时的服务器时间,主要解决不同时区请求资源时的时间混乱问题
- Server :服务器信息及对应版本
- Transfer-Encoding :发送编码。服务器发送资源时候是分块的,一般发送的资源时服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送
Transfer-Encoding: chunked :服务器分块发送的资源每一块都是独立的,都能标示自己的长度,最后一块的长度是0。当客户端读取到0长度的块时,就确定资源已经传输完成了。 - Connection :回应请求头的 Connection。
- Last-Modified :所请求的对象的最后修改日期
- Etag :就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服务器判断一个对象是否改变了。比如前一次请求某个html文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发送给WEB服务器,然后WEB服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了。
- Refresh :刷新,用于重定向
Refresh: 5;url=http://baidu.com :5秒后刷新重定向 - Access-Control-Allow-Methods :允许哪些方法来访问
Access-Control-Allow-Methods: GET,POST,PUT,DELETE
当浏览器发送一个请求后,收到应答,分析应答内容,然后将内容翻译为可供用户查看的页面,此过程成为页面渲染。页面渲染通常有两种方式:服务器渲染和客户端渲染。
服务器渲染当服务器收到请求后,需要返回的数据和 html 信息整合在一起,统一返回给浏览器,这种方法就是服务器渲染。服务器渲染发回的就是能够直接呈现给用户的 html 信息,浏览器直接翻译就可以了。大部分网站使用的是这种方式。
浏览器渲染当服务器收到请求后,只返回一个 html 的骨架,浏览器收到此 html 时,执行其附带的脚本,根据脚本再次向服务器请求数据。当浏览器收到返回的数据后,和之前收到的 html 骨架进行整合,再渲染呈现。这种方式就是浏览器渲染,它需要多次访问服务器。
基本上拉加载式的页面就是使用的浏览器渲染方式。
但是如果使用爬虫获取数据时,使用此种方式的页面可以直接获取数据而不用分析 html 信息,反而更方便。



