http 请求响应

一个完整的 http 请求,都是由哪些成员组成的呢

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

  1. 每次 请求-响应 都是独立的,相互之间互不干扰。这种模式的协议我们称之为无状态协议 http 的无状态会带来一些问题。

  2. 每次 请求-响应传递的消息都是纯文本(字符串),而且文本格式必须按照 http 协议规定的格式书写。

请求的消息格式

请求消息格式有三部分组成

请求行POST /api/user/login HTTP/1.1
请求头Host: cloud.xxx.com
Origin: http://cloud.xxx.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36
Content-Type:application/json
请求体{“loginId” :“admin”,“loginPwd”:“123123”}
  • 请求行:高度概括了客户端想要干什么
  • 请求头:描述了请求的一些额外信息
  • 请求体:包含了要给服务器传递的正文数据**。请求体是可以省略的。**

请求行

请求行是整个 http 报文的第一行字符串,它包含三个部分:请求方法 路径+参数+hash 协议和版本

重点关注请求方法

请求方法是一个单词,它表达了客户端的「动作」,比如:

  • GET:获取
  • POST:提交

在 http 协议中,并没有规定只能使用上面两种动作,甚至没有规定每种动作会带来怎样的变化而在实际的应用中,我们逐渐有了一些约定俗成的规范:

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

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

浏览器遵循了上面的规范,这带来了 GET 和 POST 的诸多区别。比如,由于 GET 请求没有请求体,所以要传递数据只能把数据放到 url 的参数中

在浏览器中,获取数据一般使用的都是 GET 请求,比如:

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

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

请求头

请求头是一系列的键值对,里面包含了诸多和业务无关的信息
浏览器每次请求服务器都会自动附带很多的请求头,其实这些请求头大部分服务器是不需要的

我们只需关注下面几个请求头即可:

  1. Host: url 地址中的主机

  2. User-Agent:客户端的信息描述

  3. Content-Type:请求体的消息是什么格式,如果没有请求体,这个字段无意义
    该字段的常见取值为:

    • application/x-www-form-urlencoded

      表示请求体的数据格式和 url 地址中参数的格式一样,比如

      loginId=admin&loginPwd=123123
      
    • application/json

      表示请求体的数据是 json 格式,比如

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

请求体

包含业务数据的字符串

理论上,请求体可以是任意格式的字符串,但习惯上,服务器普遍能识别以下格式:

  • 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

响应的消息格式

服务器(通常由后端开发),收到请求的消息后,会运行后端代码对请求进行处理,处理完成后,会给予响应。
,服务器的响应格式包含三个部分

响应行

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

响应行包含两个部分:

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

响应头 header

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

目前,对我们最重要的键值对Content-Type它有多种取值,表示响应体的数据类型。

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

  1. text/plain: 普通的纯文本,湖览器通常会将响应体原封不动的显示到页而上

  2. text/html: html 文档,浏览器通常会将响应体作为页面进行渲染

  3. text/javascriptapplicatfon/javascript: js 代码,浏览器通常会使用 JS 执行引擎将它解析执行

  4. text/css: css 代码,浏览器会将它视为样式

  5. image/jpeg: 浏览器会将它视为 jpg 图片

  6. attachment:附件,浏览器看到这个类型,通常会触发下载功能

  7. 其他 MIME类型

响应体 body

响应的主体内容

GET 和 POST 的区别

  • 协议层面:语义差别 GET 请求表示获取资源,POST 请求表示提交
  • 应用层面: GET 请求体为空
  • 浏览器层面
    • GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
    • GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
    • GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有。
  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值