设为首页 加入收藏

TOP

前后端开发必会的 HTTP 协议“十全大补丸”(万字长文)(一)
2023-07-25 21:39:19 】 浏览:73
Tags:后端开 HTTP 协议 全大补

本文全面介绍了 HTTP 协议相关知识,包括 HTTP 请求报文、响应报文、持久连接、缓存、Cookie 以及 HTTP 版本升级等!

HTTP 协议全称为 HyperText Transfer Protocol,即超文本传输协议。

  • 超文本:指文字、图片、音频、视频、文件等的混合体,比如最常见的 HTML。
  • 传输:指数据从一方转移到另一方,二者之间可能相距数千里。
  • 协议:指通信双方所做的一些约定,比如怎么开始通信、信息的格式与顺序、怎么结束通信等。

HTTP 协议是干啥的呢? 答案是用于客户端与服务器端之间的通信。我们日常上网过程中最常见的就是 HTTP 协议了,浏览器是最常见的 HTTP 客户端。

比如我们使用浏览器访问淘宝时,浏览器就会发送一个遵循 HTTP 协议的请求报文到淘宝服务器,告诉淘宝服务器自己想要获取淘宝首页信息。

淘宝服务器收到此报文后,则会发送一个同样遵循 HTTP 协议的响应报文到浏览器,此响应报文中包含淘宝首页的内容。

浏览器收到响应报文后解析内容并展示在界面上。

1. HTTP 请求

客户端向服务器端发送的信息称为请求报文,一般结构如下:

(1)请求行

请求行用于说明要做些什么,包含三部分内容,中间用空格分割。

  • 方法,指定要对请求资源做什么样的操作(比如查询、修改等)。常见的方法有:GET、POST、PUT、DELETE、HEAD 等。

    在前后端分离开发中,经常会遵循 RESTful 设计风格,其使用 POST、DELETE、PUT、GET 分别表示对数据的增、删、改、查。

  • 资源路径,指定所要请求资源在服务器中的位置。比如 /index.html,表示访问服务器根目录下名字为 index 的 html 文件。

  • HTTP 版本,指定所使用的 HTTP 版本。目前使用最多的版本为 HTTP/1.1。

举个栗子:

面试中常见的一个问题: GET 和 POST 的区别是什么?,在这里做一下解答。

  • 首先,一般 GET 请求参数存放在 URL 中,而 POST 请求参数存储在请求体中

    因为参数放在 URL 中可以直接被看到,则 GET 请求相对 POST 请求更不安全。但并不是说 POST 请求安全,因为参数放在请求体中,如果不采取加密手段的话,技术人员抓包就能看到明文。

    同时各个浏览器对 URL 长度做了限制,比如 IE 浏览器限制 URL 的长度最大为 2KB,这就使得了 GET 请求传输的数据长度有了限制,而 POST 请求传输数据长度无限制。

  • 其次,一般 GET 请求用于获取数据,POST 请求用于新增数据

    这里需要提一下幂等性的概念。幂等性是指对于同一个系统,在同样条件下,一次请求和重复多次请求对资源的影响是一致的,不会因为多次请求而产生了副作用。

    GET 请求用于获取资源,不会对系统资源进行改变,因此是幂等的。POST 用于新增资源,这意味着多次请求将创建多个资源,因此不是幂等的。

    基于这个特点,GET 请求可被缓存、可保留在浏览器历史记录中、浏览器回退不会产生副作用,而 POST 请求反之。

  • 最后,GET 和 POST 在本质上并无区别

    HTTP 的底层是 TCP,所以无论是 GET 还是 POST 底层都是通过 TCP 进行连接通信。

    我们可以给 GET 加请求体,给 POST 带上 URL 参数,可以用 GET 请求新增数据,POST 请求查询数据,实际上也是完全可行的。

(2)请求头

请求头用于向服务器传递一些额外的重要信息,比如所能接收的语言等。

请求头由字段名和字段值构成,二者之间用冒号进行分隔。常见的一些请求头有:

请求头 含义
Host 接收请求的域名
User-Agent 客户端软件的名称和版本号等相关信息
Connection 设置发送响应之后 TCP 连接是否继续保持的通信选项
Cache-Control 控制缓存的相关信息
Referer 记录请求的来源(当通过点击超级链接进入下一个页面时,会记录上一个页面的 URI)
Accept 客户端可支持的数据类型, 以 MIME 类型来表示
Accept-Encoding 客户端可支持的编码格式
Accept-Language 客户端可支持的语言
If-Modified-Since 用于判断资源的缓存是否有效(客户端通知服务器,本地缓存的最后变更时间)
If-None-Match 用于判断资源的缓存是否有效
Range 用于断点续传,指定第一个字节的位置和最后一个字节的位置。
Cookie 表示请求者的身份,用于保存状态信息

(3)请求空行

请求空行用于表明请求头已经结束。

(4)请求体

请求体用于传送客户端要发给服务器的数据,比如请求参数,通常出现在 POST 请求方法中,而 GET 方法无请求体,它的请求参数直接会显示在网址上面。

请求行和请求头的数据都是文本形式且格式化的,而请求体不同,其可以包含任意的二进制数据,比如文本、图片、视频等等。

2. HTTP 响应

服务器向客户端发送的信息称为响应报文,响应报文的结构一般如下:

(1)响应行

响应行用于说明对请求的处理情况,包含三部分内容,中间用空格分割。

  • HTTP 版本,指定所使用的 HTTP 版本。比如 HTTP/1.1 表示使用的 HTTP 版本是 1.1。

  • 状态码,以三位数字形式描述服务器对请求的处理结果。比如 200 表示成功。

  • 消息短语,以文本形式描述服务器对请求的处理结果。比如 OK 表示成功。

举个栗子:

面试中常见的一个问题: HTTP 有哪些常见状态码?,在这里做一下解答。

  • 200 OK :表示请求被正常处理,这是最常见的状态码。

  • 204 No Content:表示请求被正常处理,但在返回的响应报文中不含响应体内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面。

  • 301 Moved Permanently :永久重定向,表示请求的资源已经被永久转移了,新的 URL 定义在响应报文的 Location 字段中,浏览器将自动获取新的 URL 发出新的请求。

    对搜索引擎来说,如果是 301 永久性重定向,页面会删除失效的 URL 收录、索引,并替换为新的 URL。两个不同的 URL 有指向相同的内容,搜索引擎对这两个 URL 收录的情况不同,会导致 URL 的权重和排名被分散。做了重定向后,可以将权重和排名集中到重定向后的 URL,因此可以提升自然排名。

    场景:比如建设一个网站后,将网站的 url 变换了,重新申请一个域名,但是希望之前 url 仍然可以访问到,就可以做一个重定向到新的 url 下面。比如京东最早网址 http://www.360buy.com 重定向到 http://www.jd.com

  • 302 Found :临时重定向(即以后还可能有变化),表示请求的资源已被临时分配了新的 URL,新的 URL 会在响应报文中的 Location 字段中返回,浏览器将会自动使用新的 URL 发出新的请求。

    搜索引擎会保留原 URL 的收录和索引,并新增新 URL 的收录、索引,这样更有利于页面的程序化处理。

    比如用户在未登录时访问个人中心页面,这时可以临时重定向到登录的 url;

    或者协议发生变化,比如京东 http://www.jd.com 重定向到 https://www.jd.com

    再比如,今天夜里网站后台要系统维护,服务暂时不可用,这就属于『临时』的,可以配置成 302 跳转,把流量临时切换到一个静态通知页面

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇spring xml配置中引用java配置不.. 下一篇每日算法之左旋转字符串

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目