HTTP是基于TCP协议的一种应用层协议。全称是超文本传输协议,为什么是超文本传输协议,当我们向浏览器发送一个HTTP请求后,HTTP响应的不仅仅是文本文件也可以是HTML,CSS,JS文件,也可以是二进制的图片音频文件。
请求图形化:
我们先用fiddler抓一个包
HTTP请求: 首行:访问方式+URL+协议/协议版本 Header:key:value形式表示,每组用会车行(\n)分隔,遇到空行表示Header结束。 空行:主要用来划分header和body的 body:可以为空,如果body有值Header中会有一个Content-length属性表示body的长度
HTTP响应: 首行:协议/协议版本+状态码 header:key:val形式表示,每组用会车行(\n)分隔,遇到空行表示Header结束。 空行:主要用来划分header和body的 body:可以为空,如果body有值Header中会有一个Content-length属性表示body的长度,如果是html页面内容就是在Body中 协议总结:
空行的作用:因为header中具体有多少个键值对是不固定的,所以空行是来当作报头的结束标记,用来分割body体和header体的,HTTP是基于TCP实现的,TCP是面向字节流的,加这个空行也是为了防止粘包问题。
协议方案名:协议HTTP协议真实一个典型的协议 登录信息:现在基本已经URL不用了 域名:域名其实对应的就是目标服务器的IP,域名会根据DNS系统解析成一个具体的IP地址 端⼝号: 上⾯的 URL 中端⼝号被省略了. 当端⼝号省略的时候, 浏览器会根据协议类型⾃动决定使⽤哪个端⼝. 例如 http 协议默认使⽤ 80 端⼝, https 协议默认使⽤ 443 端⼝. 层次文件夹:当找到这个服务器后,对应的资源文件夹目录。 查询字符串:帮助我们定位具体返回那部分内容。
其中get和post是最常用的两种方法。 get一般用于获取服务器资源的请求方法,比如获取一个页面内容,获取一则新闻内容。 post一般用于登录请求,把密码和账号输入后,传给服务器,进行校验登录。
post方法和get方法区别: get一般用于获取数据如查询信息图片等post一般用于提交数据如登录。
get方法的body一般为空,需要传递的数据通过query string(查询字符串),post的query string一般为空,需要传递数据通过body来传递。
get是可以被缓存的,post一般不能缓存。 get请求一般是幂等的,post一般是不幂等的, 这个幂等可以这样理解,我们在浏览器一种搜相同的关键词,他返回的页面始终的唯一的,保证着稳定。
get对于登录这类请求可能没有post安全,因为是通过查询字符串传递的,就可能造成密码的泄露,但其实到底会不会产生安全问题,还是取决于前端对于这些敏感数据是否加密。
其他方法: put和post其实相似,只不过具有幂等性,一般用于更新 delete:一般用于删除服务器指定资源 options:返回服务器所支持的方式 head:类似get,只响应不反回体,只返回响应头 trace :回显服务器收到请求,测试时候用这个 connect 预留,暂时无法使用
这些方法可以用ajax构建,也可以用后端的注解表示,也可以html构造
Host:服务器地址和端口 Content-Length:body数据的长度 Content-type:请求body的数据格式 常见:application/x-www-form-urlencoded: form表单提交的数据格式. 此时 body 的格式形如:
title=test&content=hello
multipart/form-data: form 表单提交的数据格式(在 form 标签中加上 enctyped=“multipart/form-data” . 通常⽤于提交图⽚/⽂件. application/json: 数据为 json 格式. body 格式形如:
{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16
User-Agent (简称 UA):表示浏览器,操作系统的属性:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0
Accept: */*
其中 Windows NT 10.0; Win64; x64 表⽰操作系统信息 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 表⽰浏览器信息.
Referer:表示这个页面是从那个页面跳转过来的。
Cookie:Cookie中存储一个字符串,用于用户的身份标识。类似于区医院看病,你挂号后,给你发一个电子卡,到每个门诊通过这个电子卡标识你已经挂号过了,不用再去问你到底有没有挂号。或者,你第一次登录时候,登录成功,服务器会存储一个cookie标识你已经登录过了,在这个cookie过期之前,你再次访问这个网站,就无需登录。
body体和header的Content-type有着密切的关系,body主要有三种格式,和COntent-type 一一对应 常见:application/x-www-form-urlencoded: form表单提交的数据格式. 此时 body 的格式形如:
title=test&content=hello
multipart/form-data: form 表单提交的数据格式(在 form 标签中加上 enctyped=“multipart/form-data” . 通常⽤于提交图⽚/⽂件. application/json: 数据为 json 格式. body 格式形如:
{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16
什么是状态码? 状态码就是规定的数字,主要是起标识作用,告诉客户端或者服务端,到底是访问成功还是访问失败,或者其他情况。
访问成功的状态码:200 ok 未能找到URl标识的地址,或者不存在了的状态码:404 访问被拒绝的状态码:403 访问方法不允许:405 服务器内部错误:500 服务器过载,导致超时:504 临时重定向:302 永久重定向:301 重定向:相当于一个跳转业务,你通过原有的URL访问,但服务器接收到后,会给你跳转到一个新的URL里面,比如登陆成功后自动跳转到主页,临时重定向和永久重定向区别,就是一个可能是因为节日活动,从而临时改动的跳转,活动结束后,又恢复到原样,而永久重定向是以后都这样。
状态码小结: