1.HTTP协议的请求报文和响应报文结构
请求报文
请求行(request line):请求行包括三个字段,有请求的方法、请求URL、HTTP版本
- 请求的方法:GET\POST等等
- 请求URL:请求的地址
- HTTP版本:HTTP/2, HTTP/1.1等等
头部(header line)
- 首部字段名: 值
请求实体(entity body)
- GET方法,实体体为空;POST方法,可以不为空
响应报文
状态行(status line):状态行包括三个字段,协议版本字段、状态码、相应的状态信息
- 协议版本: HTTP1.1 / HTTP1.0 / HTTP2.0 等等
- 状态码: 2xx/ 3xx/ 4xx/ 5xx
- 状态信息: 对应状态码的状态信息
头部(header line)
- 首部字段名: 值
响应实体(entity body)
2.HTTP协议请求方法(共9种)
GET(HTTP 1.0)
- 发送一个GET请求可以获取服务器上的资源
- GET可以在请求的URL中附带参数, 比如: ?name=zhangsan
- 在浏览器地址栏输入网址访问资源的时候,都是使用GET方法来发送HTTP请求的
- GET请求所携带的数据内容有限制,只允许ASCII字符
- GET请求所携带的数据长度有限制,由于数据携带在URL里面,URL长度是有限制的(服务端和浏览器端会进行限制), 不同的浏览器的限制大小不同。
- GET只应当用于获取数据,而不是修改数据,即GET请求不应该产生副作用,幂等,即不论进行多少次GET请求都应该返回一样的结果
POST(HTTP 1.0)
- 用于向服务器上提交数据,请求的数据在body中发送,也可以在url中携带参数
- POST方法传递的数据长度没有限制
- POST方法传递的数据格式没有限制
- 通过Content-Type来确定请求中的body部分是何种类型
- POST请求可能会导致服务器上的资源被修改
- 当浏览器中页面回退的时候,浏览器会提醒POST请求会重新提交,从而可能会改变服务器上的资源
- 相较于GET更加安全,参数不会保存在浏览器的历史记录中,数据不会显示在URL中
HEAD(HTTP 1.0)
- 同GET方法,会向服务器请求资源,是获取数据, 不同的地方是此时不会返回响应报文的body部分
- 应用: 检查是否需要更新浏览器缓存(应用之一)
OPTIONS(HTTP 1.1)
- 请求web服务器,获知web服务器所支持的各种功能,包括服务器普遍支持哪些请求方法、对于特定的资源支持哪些请求方法
- 应用:发送跨域请求时,跨域请求有简单请求和复杂请求,复杂请求在真正的请求前会先发送一次OPTIONS请求,根据返回的Access-Control-* 的信息,判断是否具有访问权限。
PUT(HTTP 1.1)
- 向指定的资源位置上传其最新的内容
- 与POST不同,PUT方法是幂等的,重复执行多次,产生的效果是一样的
PATCH
-
用于资源的部分更新
-
当资源不存在的时候,会去创建该资源,PUT是对已有的资源进行更新
DELETE(HTTP 1.1)
- 请求服务器删除Request-URL所标识的资源
CONNECT(HTTP 1.1)
- HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器(这里不太了解)
TRACE(HTTP 1.1)
- 回显服务器收到的请求,主要用于测试和诊断
3.HTTP的版本
http1.0
- 默认是非持久连接,即一个TCP连接,只提供一个HTTP连接使用,如果需要建立长连接,需要设置字段Connection: keep-alive
- 支持三种请求方法:GET\POST\HEAD
- 资源请求返回整个对象,不支持断点续传
- 使用If-Modified-Since、Expires来作为缓存的判断标准
http1.1
- TCP连接可以复用,默认支持长连接,在一个TCP连接上可以传递多个HTTP请求和响应,减少了建立、关闭连接的消耗(包括时延还有运算消耗)
- 增加如下字段来支持缓存策略: If-Unmodified-Since \ If-Match \ If-None-Match\ Cache-Control
- 新增了host字段,指定服务器的域名
- 添加了支持OPTIONS\PUT\DELETE\TRACE\CONNECT作为请求方法
- 引入range,允许请求资源的某个部分(比如客户端已经有资源的一部分了,现在想要的是另一部分),服务器相应的返回了range范围的内容,则响应码是206(Partial Content),响应头部有Content-Range字段,声明返回这部分的偏移量和长度。
http2.0
- 二进制协议: 在HTTP1.1中,body部分是文本\二进制,头部部分必须是文本,即ASCII码的形式,HTTP2.0中,header和body部分都是二进制,在传输层和应用层之间多了一个二进制帧层,将不同的请求拆分成了不同的stream,并标记上id,并且将其分为head帧和data帧,根据id和帧的类型,使得在接收方的二进制帧层可以进行有序的重组。因此可以解决HTTP1.1中的请求阻塞问题。
- 多路复用: 在一个TCP连接中,Server和Client能够同时发送多个请求或者响应,不用按照顺序
- 首部压缩: 在Client和Server端使用首部表来跟踪键值对,在发送请求报文、响应报文的时候,只发送差异数据,减少头部(header)开销
- 服务器推送: 支持Server主动向客户端发送一些资源(静态资源),减少延迟时间(避免客户端再次发送请求获取资源)
4. HTTP响应的状态码
2XX
200(OK) 客户端发送的请求已经被服务端正常处理
204(No Content) 客户端发送HEAD请求时,表示响应报文中没有body部分。只需要从客户端向服务端发送信息,而服务端不需要发送信息给客户端。
206(Partial Content) 客户端请求时有range字段,请求资源的一部分,服务器执行了这部分的GET请求,响应报文中Content-Range指定这部分资源的偏移量和长度。
3XX
301(Moved Permanently) 永久重定向,请求的资源被重新分配了地址,响应头的Location字段会指定该新地址。
302(Found) 临时重定向, 资源临时改变了地址,但是以后还可能发生变化。
303(See Other) 资源改变了地址,同时应该使用GET方法来获取该资源,经常作为PUT或者POST操作的返回结果。
304(Not Modified) 可以使用客户端缓存中的数据,无需访问服务器上的资源。浏览器缓存相关。
4XX
400(Bad Request) 请求报文中存在错误,例如请求方法和请求地址不匹配。
401(Unauthorized) 表示该请求需要通过HTTP认证
403(Forbidden) 服务器拒绝该请求资源的访问
404(Not Found) 服务器上找不到请求的资源
405(Method Not Allowed) 服务器禁止使用该方法,客户端可以通过OPTIONS方法来查看服务器允许的方法,服务器的响应中,Access-Control-Allow-Methods字段会知名允许的方法,例如Access-Control-Allow-Methods: GET, HEAD, POST, PUT
5XX
500(Internal Server Error) 服务器在执行请求的时候发生了错误
502(Bad Gateway) 网关或者代理服务器收到的响应无效
503(Service Unavaliable) 服务器正处于超负载或者停机维护
504(Gateway Timeout) 网关或者代理服务器无法在规定的时间内获得想要的响应
5.URL编码
关于URL编码 - 阮一峰的网络日志 (ruanyifeng.com)
URL限制只能使用ASCII字符集来进行传输,因此"只有字母和数字[0-9a-zA-Z]、一些特殊符号"$-_.+!*'(),"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。"
使用js中的encodeURI来对url进行编码,decodeURI进行解码,是utf8编码
encodeURI()、encodeURIComponent()区别及使用场景_Saga Two的博客-CSDN博客_encodeuricomponent使用场景
注意 encodeURI不会对 ; / ? : @ & = + $ , # 进行编码, encodeURIComponent会,同时采用decodeURIComponent解码。