HTTP
http => Hyper Text Transfer Protocol 是我们前后台交互的时候的传输协议(即超文本传输协议)
url
统一资源定位符(Uniform Resource Locator),互联网每个文件url唯一
protocol://host[:port]/path/[?query]#fragment
http://www.baidu.com/index.html?name=andy&age=18#link
protocol 通信协议 常用的http,ftp,maito等
host 主机(域名)www.baidu.com
port 端口号 可选 省略时使用方案的默认端口
http协议访问受理程序80端口
https协议访问受理程序443端口
ftp协议访问受理程序21端口
sftp协议访问受理程序22端口
MySQL数据库 3306端口
mongodb 27017端口
path 路径 由零或多个’/'符号隔开的字符串 一般用来表示主机上的一个目录或文件地址(路径/路由/api)
query 参数 以键值对的形式 通过&分隔开来
fragment 片段 #后面内容 常见于链接 锚点
注:url中字符串不需加引号 会自动编码(encodeURI()
)
需要js内置函数decodeURI(经过编码的数据)
来解码
RESTful风格(表述性状态转换)
传统风格 (动宾结构)localhost:8888/goods/gettoys?page=10
RESTful风格 路径代表想访问的资源 localhost:8888/goods/toys/0/10
(0=全部玩具 10=页码…)
请求方式代表想对资源执行的操作 post添加 delete删除 put修改 get查询
RESTful风格相对传统风格更加简便,减少沟通,减少路由
HTTP 的工作流程
1.和服务器建立链接 (底层是TCP/IP协议)
2.建立链接后,发送一个请求给服务器(前端向后端发送数据包,后端根据HTTP协议解读)
3.服务器接受到请求以后进行相应的处理并给出一个回应
(后端向前端发送数据包,前端根据HTTP协议解读,根据内容进行页面渲染)
4.断开于服务器的链接 (底层是TCP/IP协议)
基于短连接的应用层协议
短连接 连接-请求-响应-断开
无状态 没有长连接,服务端并不知道客户端的身份
应用层协议
HTTP协议工作在应用层,负责数据包的构造和解读
客户端通常是浏览器在负责构造和解读数据包
服务端通常是服务器容器(tomcat/apache/nginx)在构造和解读数据包
其底层协议是TCP(传输层)/IP(网络层)
IP协议负责为服客两端分配唯一的IP地址
TCP协议负责建立稳定连接
和服务器建立链接
需要保证客户端的接受和发送正常,服务器端的接受和发送正常
TCP/IP
建立链接的主要步骤叫做 三次握手
客户端发送一个消息给到服务端
服务端回给客户端一个消息
客户端再回给服务端一个消息
至此,依照 TCP/IP
协议的建立链接就建立好了
双方都知道双方可以正常收发消息
TCP协议
稳定连接+可靠传输
UDP协议
User Datagram Protocol 用户报文协议
效率优先 连上,发送数据,断开 (直播,影视,游戏)
发送一个请求
每一个请求都要把我们的所有信息都包含请求
每一个请求都会有一个 请求报文
在 请求报文
中会包含我们所有的请求信息(也就是我们要和服务端说的话都在里面)
1.请求行
POST /user HTTP/1.1
# POST 请求方式
# /user 请求URL(不包含域名)
# HTTP/1.1 请求协议版本
2.请求头(请求头都是键值对的形式出现的)
user-agent: Mozilla/5.0 # 产生请求的浏览器信息
accept: application/json # 表示客户端希望接受的数据类型
accept-encoding: gzip #浏览器可以接受的压缩算法
Conection:keep-alive #保持一次TCP链接活跃(直到所有资源加载完毕为止)
Content-Type: application/x-www-form-urlencoded # 客户端发送的实体数据格式(get请求通常没有)
# (application/x-www-form-urlencoded [-url格式编码] /application/json [-json])
Host: 127.0.0.1 # 请求的主机名(IP)
cookie:携带客户端用户信息(cs双方都可以编辑)
Accept-Language:zh-CN,zh;q=0.9 #客户能接受的语言
3.请求空行(请求头和请求主体之间要留一个空白行)
# 就是一个空行
4.请求体(本次请求携带的数据)
# GET 请求是没有请求体数据的
# POST 请求才有请求体数据
#get请求的请求主体在浏览器表现为QueryString Parameters
#post请求的请求主体在浏览器表现为Form Data
完整的请求报文
POST /user HTTP/1.1 # 请求行
Host: www.user.com
Content-Type: application/x-www-form-urlencoded
accept: application/json
User-agent: Mozilla/5.0. # 以上是首部
#(此处必须有一空行) # 空行分割header和请求内容
name=world # 请求体
接受一个响应
客户端的请求发送到服务端以后返回一个响应
每一个响应都会有一个 响应报文
在 响应报文
中会包含我们所有的响应信息(也就是服务端在接受到客户端请求以后,给我们的回信)
1.状态行
HTTP/1.1 200 OK
# HTTP/1.1 服务器使用的 HTTP 协议版本
# 200 响应状态码
# OK 对响应状态码的简单解释
2.响应头
Date: Jan, 14 Aug 2019 12:42:30 GMT # 服务器时间
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45 # 服务器类型
Content-Type: text/html # 服务端给客户端的数据类型
#text/html HTML页面 text/plain 普通文本 text/json JSON数据
Content-Length: 11 # 服务端给客户端的数据长度
Content-Encoding:gzip #
Set-Cookie: #服务端写入客户端的COOKIE信息
Cache-Control:xxx #缓存时间
Access-Control-Allow-Origin:xxx #允许哪些前端跨域访问我
Expires:Wed,22 Dec 2021 07:56:25 GMT #响应超时时间
3.响应体
hello world
# 服务端给客户端的响应数据
断开于服务端的链接
之前我们的建立链接是基于 TCP/IP
协议的 三次握手
我们的断开链接是基于 TCP/IP
协议的 四次挥手
1.客户端发送一个我要断开的消息给服务端
2. 服务端接受到以后发送一个消息告诉客户端我已经进入关闭等待状态
3. 服务端再次发送一个消息告诉客户端,这个是我的最后一次消息给你,当我再接受到消息的时候就会关闭
4. 客户端接受到服务端的消息以后,告诉服务器,我已经关闭,这个是给你的最后一个消息
常见的 HTTP 响应状态码
在一个 HTTP 请求的响应报文中的状态行会有一个响应状态码
这个状态码是用来描述本次响应的状态的
通常会出现五种状态码
1.100 ~ 199
2.200 ~ 299
3.300 ~ 399
4.400 ~ 499
5.500 ~ 599
100 ~ 199
一般我们看不到,因为表示请求继续
100: 继续请求,前面的一部分内容服务端已经接受到了,正在等待后续内容
101: 请求者已经准备切换协议,服务器页表示同意
200 ~ 299
2 开头的都是表示成功,本次请求成功了,只不过不一样的状态码有不一样的含义(语义化)
200: 标准请求成功(一般表示服务端提供的是网页)
201: 创建成功(一般是注册的时候,表示新用户信息已经添加到数据库)
203: 表示服务器已经成功处理了请求,但是返回的信息可能来自另一源
204: 服务端已经成功处理了请求,但是没有任何数据返回
300 ~ 399
3 开头也是成功的一种,但是一般表示重定向
301: 永久重定向
302: 临时重定向
304: 资源未被修改(使用的是缓存的数据)
305: 使用代理
400 ~ 499
4 开头表示客户端出现错误了
400: 请求的语法服务端不认识
401: 未授权(你要登录的网站需要授权登录)
403: 服务器拒绝了你的请求
404: 服务器找不到你请求的 URL
407: 你的代理没有授权
408: 请求超时
410: 你请求的数据已经被服务端永久删除
500 ~ 599
5 开头的表示服务端出现了错误
500: 服务器内部错误
503: 服务器当前不可用(过载或者维护)
505: 请求的协议服务器不支持
常见的 HTTP 请求方式
每一个 HTTP 请求在请求行里面会有一个东西叫做请求方式
不同的请求方式代表的含义不同
1.GET: 一般用于获取一些信息使用(获取列表)
2.POST: 一般用于发送一些数据给服务端(登录)
3.PUT: 一般用于发送一些数据给服务当让其添加新数据(注册)
4.DELETE: 一般用域删除某些数据
5.HEAD: 类似于 GET 的请求,只不过一般没有响应的具体内容,用于获取报文头
6. CONNECT: HTTP/1.1 中预留的方式,一般用于管道链接改变为代理的时候使用
7. PATCH: 是和 PUT 方式类似的一个方式,一般用于更新局部数据
8. OPTIONS: 允许客户端查看服务端性能
我们比较常用的就是 GET 和 POST
GET 请求
参数以 querystring
的形式发送,也就是直接拼接在 请求路径的后面
GET 请求会被浏览器主动缓存
GET 请求根据不同的浏览器对长度是有限制的
IE: 2083 个字符
FireFox: 65536 个字符
Safari: 80000 个字符
Opera: 190000 个字符
Chrome: 8182 个字符
APACHE(server): 理论上接受的最大长度是 8192 个字符(有待商榷)
对参数的类型有限制,只接受 ASCII 码的格式
POST 请求
参数以 request body
的形式发送,也就是放在请求体中
POST 请求不会被浏览器主动缓存,除非手动设置
POST 请求理论上是没有限制的,除非服务端做了限制
对参数类型没有限制,理论上可以传递任意数据类型,只不过要和请求头对应
get与post区别
GET请求获取数据
POST请求提交数据 (可以在数据详情中对操作意图做具体说明) => {type:delete/updata…}
GET请求的数据在地址栏中,POST请求在请求体里(GET没有请求体)
GET请求携带的数据量有限(地址栏携带的参数长度不同浏览器限制不一样)
POST请求体中携带的数据理论上没有上限