文章

网络基本概念之http请求

请求消息格式有三部分组成:请求行、请求头、请求体。

网络基本概念之http请求

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

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

请求的消息格式

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

image-20220415173353

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

请求行

请求行是整个 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

请求头 header

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

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

你可以说不要,但不能说我没给

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

  1. Host:url 地址中的主机

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

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

    该字段的常见取值为:

    • application/x-www-form-urlencoded

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

      1
      
      loginId=admin&loginPwd=123123
      
    • application/json

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

      1
      
      { "loginId": "admin", "loginPwd": "123123" }
      
    • multipart/form-data

      一种特殊的请求体格式,上传文件一般选择该格式

请求体 body

包含业务数据的字符串

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

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

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

本文由作者按照 CC BY 4.0 进行授权