2023-07-01 带你重温HTTP请求协议

前言

在我们日常工作中,在前后端联调中接口请求发生错误时候,有的是4xx错误,有的是5xx错误,往往测试人员不明确前后端的责任时,都是一股脑的分给了前端人员,而我们在调试复现bug的时候,要对接口请求和响应知道的一清二楚,问题才会快速解决,这篇文章带你温习下HTTP到底是什么?

HTTP是什么,由哪些组成的?

客户端与服务器之间进行通信也就是对话,要能听得懂对方在说什么,就必须要规定一种通用语言,不然你说的人家听不懂,就没法继续交流了

而这种通用语言就是协议,HTTP就是我们常用的一种协议

HTTPS是在HTTP基础上发展起来的,它增加了安全协议,其它的和HTTP完全一致

HTTP是基于请求-响应的方式完成通信的,每一次通信都是由客户端向服务器发起请求,传递一些消息过去,然后经过服务器程序处理后,响应给客户端一些消息。

HTTP协议规定:

  1. 每一次请求-响应都是独立的,相互之间不干扰,这种模式的协议称之为无状态协议
  2. 每次请求-响应传递的消息都是纯文本(字符串),而且文本格式必须按照HTTP协议规定的格式书写

image.png

HTTP请求的消息格式如下:

image.png

  • 请求行-高度概括了客户端想要干什么
  • 请求头-描述了请求的一些额外信息
  • 请求体-包含了要给服务器传递的正文数据,请求体是可以省略的

请求行

请求行是整个HTTP报文的第一行字符串,包含三个部分:

请求方法 路径+参数+hash 协议和版本

比如一个完整的GET请求地址:https://www.douyin.com/news?page=1&size=20,这里的请求头就是GET /new?page=1&size=20 HTTP/1.1

这里重点关注请求方法,请求方法是一个单词,表达了客户端的动作,比如:

  • GET:获取
  • POST:提交

在HTTP协议中,并没有规定只能使用这两种动作,甚至没有规定每种动作会带来怎样的变化,而在实际应用中,前后端人员逐渐有一些约定成俗的规范

1、动作通常有:GET(获取资源)、POST(提交消息)、PUT(修改数据)、DELETE(删除数据),其中GET和POST最为常见

2、GET和DELETE请求不能有请求体,而POST和PUT请求可以有请求体

浏览器遵循了上面的规范,在浏览器中,获取数据一般使用的都是GET请求,比如:

  • 在地址栏输入地址并按下回车
  • 点击了某个a元素
  • 获取图片、音频、视频
  • 获取css、js、字体等文件

事实上,浏览器自动发出的请求基本都是GET请求,而POST请求需要开发者手动处理,比如在form表单中设置method为POST

请求头

请求头是一系列的键值对,里面包含了诸多和业务无关的信息

浏览器每次请求服务器都会自动附带很多的请求头,其实这些请求头大部分服务器都是不需要的

你可以说不用,但不能说没给

image.png

请求头的信息众多,主要关注的有以下几个即可:

  1. Host:url地址中的主机,也就是域名+端口

image.png

  1. User-Agent:客户端的信息描述,表示发出的请求的人到底是谁,可以随便写,完全靠自觉

image.png

  1. Content-Type:请求体的消息是什么格式,如果没有请求体,这个字段无意义

    该字段的常见取值为:

    • application/x-www-form-urlencoded表示请求体的数据和url地址中参数的格式一样,比如:

         loginId=admin&loginPwd=111111
      
    • application/json表示请求体的数据是json格式,比如:

         {"loginId":"admin", "loginPwd":"111111"}
      
    • multipart/form-data一种特殊的请求体格式,上传文件一般选择该格式

    • text/plain表示纯文本

请求体

包含业务数据的字符串

理论上,请求体可以是任意格式的字符串,但习惯上,服务器普遍能识别以下格式,而且要与请求头里的Content-Type字段一致

  • application/x-www-form-urlencoded属性名=属性值&属性名=属性值...
  • application/json{"属性名":"属性值", "属性名":"属性值"}
  • multipart/form-data:使用某个随机字符作为属性之间的分隔符,通常用于文件上传

由于请求体格式的多样性,服务器在分析请求体时可能无法知晓具体的格式,从而不知道如何解析请求,因此,服务器往往要求在其请求头中附带一个属性Content-Type来描述请求体使用的格式,如下:

Content-Type: application/x-www-form-urlencoded
Content-Type: application/json
Content-Type: multipart/form-data

请求之后就是响应了,那么响应的消息格式是什么,又由哪些组成呢

响应的消息格式如下:

image.png

其实和请求头差不多,服务器收到请求的消息,会运行后端代码对请求进行处理,处理完成后,会给予响应

服务器的响应格式也包含如上图的三个部分:响应行、响应头与响应体

响应行

响应行是整个响应字符串的第一行

包含两个部分:

  • 协议版本:表示服务器打算和客户端用什么协议通信
  • 状态码、状态消息:表示服务器对当前请求的表态

image.png

响应头

和请求头一样,响应头也是由多个键值对组成,具体有哪些键值对,完全取决于服务器程序

目前,对前端来说最重要的键值对是Content-Type,它有多种取值,表示响应体的数据类型

在B/S模式中,浏览器会自动根据响应头中的Content-Type的取值,决定如何处理响应体

  1. text/plain:普通的文本,浏览器通常会将响应体原封不动的显示到页面上
  2. text/html:HTML文档,浏览器会将响应体作为页面进行渲染
  3. text/javascriptapplication/javascript:js代码,浏览器会使用JS引擎将它解析执行
  4. text/css:css代码,浏览器会将其视为样式
  5. image/jpeg:浏览器会将其视为jpg图片
  6. attachment:附件,浏览器看到整个类型,会触发下载功能
  7. 其他MIME类型

比如输入百度网址,则会看到响应的是text/html

image.png

在搜索图片,响应的是image/jpeg

image.png

响应体

响应的主题内容,浏览器其实是用户代理,帮用户处理这些事情

比如图片的话就是二进制数据,这里浏览器会自动解析二进制数据转为图片

image.png

页面的话就是文本数据,response是html,浏览器会自动解析渲染

image.png

image.png

请求-响应的基本逻辑总结来说就是一个东西发过去了-行头体(请求),一个东西发过来了-行头体(响应)就是这么简单的道理

状态码

通常状态码和状态消息是一一对应的,比如状态码200的消息就是OK

不同的请求可能会得到不同的状态码,至于到底会得到哪个状态码,由后端程序决定

现在有一些公司约定后端返回的响应行的状态码都是200,至于消息状态放到了响应体中,主要取决于后端怎么定义的,都有可能

状态码分为五类:

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作,如请求协议是HTTP1.1,而服务器用HTTP2,则返回101表示继续发请求
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求,如请求地址搬家了返回301等
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

通常认为0-399之间的状态码都是正常的,其他都是不正常的

常见的状态码有:

  1. 200 OK:一切正常
  2. 301 Moved Permanently:资源已被永久重定向

    你的请求我收到了,但是呢,你要的东西不在这个地址了,我已经永远的把它移动到了一个新的地址,麻烦你重新请求新的地址,地址我放到了请求头的Location中了,比如斗鱼以前的地址为www.douyutv.com ,点击会重定向到www.douyu.com

  3. 302 Found:资源已被临时重定向

    你的请求我收到了,但是呢你要的东西不在这个地址了,我临时把它移动到了一个新的地址,麻烦你取新的地址,地址我也放到了请求头的Location中了。注意:与301区别的是301有缓存,302没有缓存

  4. 304 Not Modified:文档内容未被修改

    你的请求我收到了,你要的东西跟之前的一样的,没有任何的变化,所以我就不给你结果了,你自己就用以前的吧

  5. 400 Bad Request:语义有误,当前请求无法被服务器理解

    你给我发的是啥啊,我都看不懂

  6. 403 Forbidden:服务器拒绝执行

    你的请求我已收到,但是我就是不给你东西

  7. 404 Not Found:资源不存在

    你的请求我已收到,但我没有你要的东西

  8. 500 Internal Server Error:服务器内部错误

完结撒花~~~

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYUogZqw' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片