HTTP 协议
HTTP 是一种在客户端和服务器之间编码和传输数据的方法。
它是一个请求/响应协议:客户端和服务端针对相关内容和完成状态信息的请求和响应。
HTTP 是独立的,允许请求和响应流经许多执行负载均衡,缓存,加密和压缩的中间路由器和服务器。
一个基本的 HTTP 请求由一个动词(方法)和一个资源(端点)组成。
HTTP 是依赖于较低级协议(如 TCP 和 UDP)的应用层协议。
HTTP请求
发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议中发送到服务器指定端口(HTTP协议80/8080, HTTPS协议443)。
HTTP请求报文是由三部分组成:
- 请求行
- 请求报头 Header
- 请求正文
请求行
格式如下:
Method Request-URL HTTP-Version CRLF
例如 GET /index.html HTTP1.1
常用的方法有: GET, POST, PUT, DELETE, OPTIONS(返回请求的资源所支持的方法), HEAD(仅请求响应首部)。
请求头信息 Request Header
请求报头允许客户端向服务器传递请求的附加信息和客户端自身的信息。
客户端不一定特指浏览器,有时候也可使用Linux下的CURL命令以及HTTP客户端测试工具等。
常见的请求报头有:
- Accept:指定客户端用于接受哪些类型的信息
- Accept-Charset
- Accept-Encoding:指定客户端接受的编码方式
- Accept-Language
- Content-Type
- Authorization:客户端提供给服务器的认证信息
- Cookie:每次请求时都会携带上 Cookie 以方便服务器端识别是否是同一个客户端
- Connection:设置为 keep-alive 用于告诉客户端本次HTTP请求结束之后并不需要关闭TCP连接,这样可以使下次HTTP请求使用相同的TCP通道,节省TCP连接建立的时间
- User-Agent:用户代理,一般情况是浏览器,也有其他类型
请求正文
当使用POST, PUT等方法时,通常需要客户端向服务器传递数据。
这些数据就储存在请求正文中。在请求包头中有一些与请求正文相关的信息,例如: 现在的Web应用通常采用 Restful 架构,请求的数据格式一般为json。这时就需要设置 Content-Type: application/json
。
HTTP响应
HTTP响应报文也是由三部分组成:
- 状态码
- 响应报头
- 响应报文
状态码
状态码是由3位数组成,第一个数字定义了响应的类别,且有五种可能取值:
- 1xx:指示信息–表示请求已接收,继续处理
- 2xx:成功–表示请求已被成功接收、理解、接受
- 3xx:重定向–要完成请求必须进行更进一步的操作
- 4xx:客户端错误–请求有语法错误或请求无法实现
- 5xx:服务器端错误–服务器未能实现合法的请求
例如 HTTP 1.1 200 OK
(即版本号 + 状态码)
响应报头 Response Header
响应报文
服务器返回给浏览器的文本信息,通常HTML, CSS, JS, 图片等文件就放在这一部分。
HTTP header中的 Cache-control
网页的缓存是由HTTP消息头中的 Cache-control
来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。其作用根据不同的重新浏览方式分为以下几种情况:
打开新窗口
如果指定Cache-control
的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如:Cache-control: max-age=5
表示当访问此网页后的5秒内再次访问不会去服务器。在地址栏回车
如果指定Cache-control
的值为private或must-revalidate,则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。按后退按扭
如果指定Cache-control
的值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问按刷新按扭
无论为何值,都会重复访问
当指定Cache-control值为“no-cache”时,访问此页面不会在Internet临时文件夹留下页面备份。