目录
http协议即超文本传输协议,是处于应用层的、半双工通信协议。
1.http协议的特点
[1]http协议是无状态的协议:http协议对于事物处理没有记忆能力。当我们发送http请求到服务端时,服务端会根据我们的请求返回相应的数据信息给我们,但是并不会对本次请求进行记录->若是下一次请求,需要上一次请求的信息,则它必须重传,这可能导致每次传送的数据量变大,造成应答时间过长。
[2]http协议是无连接的协议:在每次发送请求都会建立一个连接,当本次请求结束之后就会将连接断开(每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户端的应答后,即断开连接)。
[3]http协议是一个相对安全的协议:因为http协议是基于TCP协议进行数据传输的,因此可以保证数据的完整性,不会发生丢包、串包现象。
[4]http协议是一个灵活的协议:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
[5]http协议是一个简单快速的协议:http协议非常简单,在客户端向服务器发送请求时,只需要携带请求方法与url;使得HTTP服务器的程序规模小,因而通信速度很快.
[6]支持客户/服务器模式
2.常见的http请求方式
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT
- GET: 通常用于请求服务器发送某些资源;
- HEAD:类似与GET,只不过返回的响应体中没有具体内容,只有报文头,用于获取报文头;
- 比如说我们当我们检查某些数据资源是否还存在时,可以发送head请求->因为我们不需要资源,只需状态码就可以确定资源是否存在;
- POST: 发送数据给服务器;
- PUT: 用于新增资源或者使用请求中的有效负载替换目标资源的表现形式
- DELETE: 用于删除指定的资源
- PATCH: 用于对资源进行部分修改
- OPTIONS: 用于获取目的资源所支持的通信选项
- 可用来验证是否跨域
- CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
- TRACE: 回显服务器收到的请求,主要用于测试或诊断
get请求与post请求的区别
在了解get请求与post请求区别的前提,我们需要知道get请求与post请求传递参数的原理:
- get请求:
- 浏览器发送:参数是在url路经中进行拼接,是在请求行中
- 服务器接收:切割url,得到参数;
- post请求
- 浏览器发送:
- 将传递的参数(数据)切割为一个一个的数据包(数据包的数量与带宽和数据大小有关);
- 在发送的时候,并不是一起发过去的,而是以数据包为单位进行发送的;
- 此时会发生丢包的现象(低概率)
- 当所有数据包发送完毕,会发送一个标识,标识所有数据包发送完毕
- 服务端接收:
- 在接收时,利用 累加器思想 ;
- 存在data事件,执行时机:每次接收一个数据包就会执行一次;
- 存在end事件,执行时机:当所有数据包接收完毕,会执行一次;
- 浏览器发送:
由原理我们可以看出get与post请求的区别
- [1]位置不同
- get请求的参数是在请求行中;
- post请求的参数是在请求体中;
- [2]大小不同
- get请求的参数,拼接在路经中,有大小限制,--一般在1M左右
- post请求的参数,在请求体中,不存在大小限制
- [3]速度(效率)不同
- get请求的参数,请求速度快;
- post请求的参数,请求速度慢;
- [4]安全性不同
- get请求的参数,不安全(拼接在路径中)
- post请求的参数,安全(传输过程中为二进制)
- [5]使用场景不同
- get请求用于在服务器获取数据;
- post请求用于向服务器发送数据;
使用场景
- 安全性问题用post(eg:登录注册)
- 参数具有文件的使用post
- 其余一般优先使用get
什么时候使用post请求,什么时候使用put请求
- 若是接口需要是幂等的,就是用put请求,若是接口不需要幂等的就使用post请求;
- eg:比如添加一条相同的数据
- 若是需要覆盖上面的一条,返回相同的结果,那么就使用put;
- 若是需要插入两条相同的数据,使用post;
- eg:比如添加一条相同的数据
检测跨域-options请求
通过跨域资源共享这篇文章,我们可以总结以下几点:
[1]CORS
跨源资源共享
(CORS)是一种基于 HTTP 头的机制,该机制允许服务器标识 除了本身origin以外还有哪些origin可以访问加载自己的资源(告诉浏览器) 。- 对可能对服务器数据产生副作用的 HTTP 请求方法(特别是GET以外的 HTTP 请求,或者搭配某些MIME类型的POST请求),浏览器必须首先使用OPTIONS方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证.
- [1]简单请求不会发起预检测请求;
- [2]复杂请求在发送请求之前会先发送一个预检测请求,只有确认允许之后才会发送真实请求;
[2]预检测请求options
- 特点
- [1]请求不会携带数据,没有请求体;
- [2]响应没有响应体;
- [3]请求不会对服务器资源产生影响
- 过程
- [1]发送预检测
-
Origin: https://foo.example // 请求的域名 Access-Control-Request-Method: POST // 告诉服务器真实请求的请求方法 Access-Control-Request-Headers: X-PINGOTHER, Content-Type // 告诉服务器真实请求添加的请求头字段
-
- [2]得到响应
-
Access-Control-Allow-Origin: https://foo.example // 请求允许的域名(若是为*表示所有域名都允许向该服务器发送资源) Access-Control-Allow-Methods: POST, GET, OPTIONS // 允许发送的请求方法 Access-Control-Allow-Headers: X-PINGOTHER, Content-Type // 允许携带的请求头参数 Access-Control-Max-Age: 86400 // 该资源的有效时间-(强制缓存)
-
- [1]发送预检测
3.http请求报文
http请求报文由三部分组成--> 请求行、请求头、请求体;
[1] 请求行
如上图所示为请求行,包括
- 请求方式
- 请求url
- 请求协议名与版本号
[2] 请求头
请求头允许客户端传递关于自身的信息和希望的响应形式;
Accept
Accept就是告诉服务端客户端可以接收哪些类型的文件数据;
- */* 表示可以接收任意类型的数据
Accept-Encoding
Accept-Encoding就是告诉服务器客户端可以接收哪些类型的编码方式;
Accept-Language
Accept-Language就是告诉服务器客户端可以接收那种语言;
Authorization
授权信息:jwt--token信息(手动添加)
Connection
Connection指的是http的连接类型。
- connection:keep-alive;表示是长连接;
- connection:close;表示是短链接
Cookie
Cookie:cookie信息(自动添加)
Host
域名以及端口号
scheme
scheme:http/https;协议
methods
methods:get/put/post;请求方式
path
path:请求路径
If-None-Match
If-None-Match:(http1.1版本协商缓存Etag标记)
If-Modified-Since
If-Modified-Since:(http1.0版本协商缓存时间)
空行
它的作用是通过一个空行,告诉服务器请求头部到此为止
[3]请求体
- get请求没有请求体;
- post请求将请求数据添加在请求体中;
4.http响应报文
[1]响应行
如上图所示为响应行,包括
- 响应协议名与版本号
- 状态码
- 状态码文本描述
[2]响应头
响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据;
- Allow:服务器支持哪些方法(get/post等)
- Content-Encoding;文档的编码方式
- Content-length;文档内容长度;
- Cache-Contol:(http1.1设置强制缓存的)控制控制页面的缓存与否
no-cache;浏览器和缓存服务器都不应该缓存页面信息
max-age>0;强制缓存直接从游览器缓存中 提取
max-age<=0;向server 发送http 请求确认 ,该资源是否有修改 (没有修改返回200,修改过返回304) - expires:(http1.0版本设置强制缓存的)
- Etag:(http1.1版本设置协商缓存的)
- Last-Modified;文档最后改动的时间(http1.0版本设置协商缓存的);
- Set-Cookie:设置和页面关联的Cookie。
- Access-Control-Allow-Origin:cros设置允许跨域标志
- 响应体:响应的消息体
- 如果是纯数据就是返回纯数据
- 如果请求的是HTML页面,那么返回的就是HTML代码
- 如果是JS就是JS代码
[3]空行
表示以下不再有响应头
[4]响应体
服务端返回的数据
5.常见状态码
浏览器-http常见的状态码_乖女子@@@的博客-CSDN博客