【青训营】-💗HTTP实用指南

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【青训营】-💗HTTP实用指南

前言


作为一个前端,如果能够深刻理解 HTTP 通信,能够让我们在日常开发工作中快速定位问题。最近正好参加了第一节字节青训营,今天刚肝完HTTP的课程,这里做了一些笔记,希望对大家有帮助,有记录错误的地方还望大佬们指出~🧐


一、初识HTTP

首先哈,先抛出一个问题哈,说一说从输入URL到页面呈现发生了什么?


e0ef2af1d24c4a96b073b9c36b203445_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif


这是一个可以无限难的问题。出这个题目的目的就是为了考察你的 web 基础深入到什么程度。介于这篇文章主要是介绍HTTP的相关知识,这里就把重要的过程描述一下~


具体可参考(1.6w字)浏览器灵魂之问,请问你能接得住几个?


网络请求——> 网络响应——>构建DOM树——>样式计算——>生成布局树——>建图层树——>生成绘制列表——>生成图块和生成位图——>显示器显示内容


069c2d4805a64f54af3060749bd6d251_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


这是一个极简的图,其实上每一步都十分的复杂,这篇文章主要是基于HTTP协议,我们就主要就聚焦于浏览器发起请求,服务器响应请求这一网络通信部分。


1.1 什么是HTTP


  • Hyper Text Transfer Protocol超文本传输协议
  • 应用层协议,基于TCP协议
  • 请求 响应
  • 简单可扩展
  • 无状态


96a62e335c60451bb37acbc55757b92f_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


HTTP在设计的时候它是一个Client-Server这样的协议,它是有请求和响应的。


e4dd81fda7de49748d1996c3b5c52813_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

二、协议分析


2.1 发展


我们每一个优秀的技术其实都是在不断进步的过程。HTTP也是更新迭代了多个版本~


1a412bb033174c1c840f4cab3e5427c6_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


2.2 HTTP报文结构


对于TCP而言,在传输的时候分为两个部分:TCP头和数据部分,而HTTP类似,也是header+body


56b8971ff0ef4e0089e0a6543eff5852_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


起始行


对于请求报文来说,起始行类似下面这样:


POST / HTTP/1.1
复制代码


也就是方法 + 路径 + http版本


对于响应报文来说,起始行类似下面这样:


HTTP/1.1 403 Forbidden
复制代码


http版本、状态码和原因三部分组成。


头部


image.png


空行


实体(数据部分)


就是具体的数据了,也就是body部分。请求报文对应请求体, 响应报文对应响应体


Method


a45166471726495cbecb2bb68527ad73_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


Safe(安全的):不会修改服务器的数据的方法


GET HEAD OPTIONS

Idempotent(幂等):同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的所有safe的方法都是Idemponent的

GET HEAD OPTIONS PUT DELETE


状态码


1xx:指示信息,表示请求已接收,继续处理

2xx:成功,表示请求已被成功接收、理解、接受

3xx:重定向,要完成请求必须进行更进一步的操作

4xx:客户端错误,请求有语法错误或请求无法实现

5xx:服务端错误,服务端未能实现合法的请求。


常见状态码


  • 200 OK —客户端请求成功
  • 301 永久重定向
  • 302 临时重定向
  • 401 请求未经授权
  • 404 请求资源不存在,可能是输入了错误的URL
  • 500 服务器内部发生了不可预期的错误
  • 504 Gateway Timeut-网关或者代理的服务器无法在规定的时间内获得想要的响应。


RESTful API


  • 早已推广使用
  • 传统API设计:把每个url当做一个功能
  • Restful API设计:把每个url当做一个唯一的资源 RESTful API 是一种API设计风格
  1. 每一个URI代表一种资源;
  2. 客户端和服务器之间,传递这种资源的某种表现层;
  3. 客户端通过HTTP method,对于服务器端资源进行操作,实现“表现层状态转化”

尽量不用url参数,用method表示操作类型。


2f005813d2de4843a1d300b616edb9cc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

753ae14db4fe4962a78749754de75886_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


常见请求头


387d4b642fe74e36bc1c88c5fda75449_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

常见响应头


85d98544aa2a44db80323a225b43a140_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

缓存


2024598156a1469eb153d6e9c0fb42d4_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

07a9aa020ce943b6932424c64960b639_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


cookie


Set-Cookie -response


973d2b7bacc84359a978857372c09e56_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


2.3 HTTP/2概述:


更快、更稳定、更简单 帧(frame):HTTP/2通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流。


97b292f8954f4e118274e0e48cdc3bf4_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


消息:与逻辑请求或响应消息对应的完整的一系列帧。

数据流:已建立的连接内的双向字节流,可以承载一条或多条信息。

交错发送,接收方重组织


c0cd54ad38654b15a5ca0772722d77f2_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


HTTP/2连接都是永久的,而且仅需要每个来源一个连接

流控制:阻止发送方向接收方发送大量数据的机制

服务器推送

2db3581492174b63ab081e4d29800b5c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


2.4HTTPS概述


HTTPS是经过TSL/SSL加密


  • 对称加密:加密和解密都是使用同一个密钥
  • 非对称加密,加密和解密需要使用两个不同的密钥:公钥(public key)和私钥(private key)


d379bfe5689a44c789cbf8f129b3e030_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


三、场景分析


3.1 静态资源


我们打开Chrome调试工具,选择到NetWork选项,尝试访问掘金官网,我们一起来研究一下静态资源请求的详细内容。这里我们研究的静态资源请求是index.css


82bf1ccd22d448f39897e0b60c9aff40_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


我们可以发现这个状态码是200,从硬件缓存中读取,因此有时状态码为200,不一定会发起一个真实的请求。

我们来看一下响应头:


6950e38a1d5d408db78ee3b87dfe6792_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


cache-control这个指定了过期时间,与强缓存相关。


last-modified指定了最后修改时间,与协商缓存相关。


access-control-allow-origin允许哪些origin能访问我们,与同源策略有关。

content-type指定了实体数据的类型

静态资源方案:缓存+CDN+文件名hash

CDN:内容分发网络,通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务。


d4bd72f0b8c847b59ffed66364b59a45_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


文件名hash的作用是根据文件内容生成hash值,这样,文件内容变化的时候,请求文件名就不一样,就不会用到缓存,以获取到最新文件内容。


3.2 登录


我们退出掘金官网,然后尝试登录,捕捉登录请求,请求如下:


General:


4b78cfc210d140149011f8274ff34f90_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


Response Headers:


0de964c08fac4a7bbd05f2a7f864947e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


Request Headers:


5ddc0be483034ad899ba8b143d9c089a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


  1. 向什么地址做了什么动作?
  • 使用POST方法
  • 目标域名 juejin.cn
  • 目标path/passport/web/sms_login/?account_sdk_source=web
  1. 携带了哪些信息,返回了哪些信息
  1. 携带信息
  • Post body,数据格式为form
  • 希望获取的数据格式为json
  • 已有的cookie
  1. 返回信息
  • 数据格式json
  • 种cookie的信息


鉴权


c1dd5e45c39044c4bfaa31a7ad3ee56e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


3.3 视频播放


2c204a2d703f4b30ba8debd72bac8942_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


757404ed05074ef280ca69d906bb3498_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


视频直播协议


协议 描述 优点
HLS HTTP live Streaming,Apple公司;基于HTTP协议;把一段视频流,分成一个个小的基于HTTP的文件来下载 - 跨平台
RTMP Real Time Messaging Protocol,Adobe公司,基于TCP 时延低
HTTP-FLV 基于HTTP,http+flv,将音视频数据封装成FLV格式,然后通过HTTP协议传输给客户端 时延低


3.4 文件上传


64cdc31df44547a78b5eda195f348791_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


主流方案:


9ec86810dfb84c978869f28ac3331d3c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


为什么文件上传时有很多的options的请求?

因为触发了跨域的场景。作用是问服务端是否允许跨域。


11a0aa9e226847f28f60a67caf47312e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


跨域解决方案


  • CORS
  • 代理服务器
  • 同源策略是浏览器的安全策略,不是HTTP的
  • iframe
  • 诸多不便


四、实战


AJAX之XHR


95c1cd474b0749bf9a9508b401b7b66d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


AJAX之Fetch


7d3e2934a8a84c039918220576ed01f8_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


标准库:HTTP/HTTPS


  • 默认模块,无需安装其他依赖
  • 功能有限/不是十分友好


02d565cc3ccf494196ea3784f01db631_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


常用的请求库:axios


  • 支持浏览器、node.js环境
  • 丰富的拦截器


5e6653eca7f341f4973c105991d9a5a5_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


用户体验


我们在生产环境中,其实还关心用户的体验,我们希望用户有更优秀的体验效果,那么用户体验去优化它,一方面是大家知道的性能优化,还有一点是在网络上做一些优化,比如用HTTP2,它的传输效率而是更高的,使用CDN,传输获取的数据是更快的等等。

网络优化:


aba359782cc1442682f5e56a0db2bac2_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


稳定性:


88d5f7ddaa7341878fcee4dd51a33538_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


五、扩展


5.1 通信方式


WebSocket

  • 浏览器与服务器进行全双工通讯的网络技术
  • 典型场景:实时性高,例如聊天室
  • URL使用ws://或wss://等开头


3442b909e93e4d7089228e8d6300462b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

QUIC:Quic UDP Internet Connection

虽然基于UDP,但是可以实现类似于TCP的可靠传输及加密传输。

546a556e624742fd9d1fa66291b46f83_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


QUIC也是HTTP3版本的协议之一,也就是说HTTP3将会是基于UDP的!


最后


⚽好啦,关于HTTP的基础知识就介绍完啦,本篇只是起到一个抛砖引玉的效果,对HTTP感兴趣的同学可以再深入研究一下~

⚾如果你对这篇文章感兴趣欢迎点赞关注+收藏,更多精彩知识正在等你!😘

相关文章
|
7月前
|
缓存 网络协议 安全
Android网络面试题之Http基础和Http1.0的特点
**HTTP基础:GET和POST关键差异在于参数传递方式(GET在URL,POST在请求体),安全性(POST更安全),数据大小限制(POST无限制,GET有限制),速度(GET较快)及用途(GET用于获取,POST用于提交)。面试中常强调POST的安全性、数据量、数据类型支持及速度。HTTP 1.0引入了POST和HEAD方法,支持多种数据格式和缓存,但每个请求需新建TCP连接。**
61 5
|
7月前
|
缓存 网络协议 Android开发
Android网络面试题之Http1.1和Http2.0
HTTP/1.1 引入持久连接和管道机制提升效率,支持分块传输编码和更多请求方式如PUT、PATCH。Host字段指定服务器域名,RANGE用于断点续传。HTTP/2变为二进制协议,实现多工处理,头信息压缩和服务器推送,减少延迟并优化资源加载。HTTP不断发展,从早期的简单传输到后来的高效交互。
82 0
Android网络面试题之Http1.1和Http2.0
|
网络协议 程序员 测试技术
一篇吃透 HTTP 请求
一篇吃透 HTTP 请求
121 0
|
前端开发 安全 网络协议
前端面试题目总结(Http)
前端面试题目总结(Http)
125 0
前端面试题目总结(Http)
|
存储 Web App开发 负载均衡
HTTP学习笔记(二) 相识篇
HTTP学习笔记(二) 相识篇
HTTP学习笔记(二) 相识篇
|
前端开发 Apache
【前端 · 面试 】HTTP 总结(二)—— HTTP 消息
最近我在做前端面试题总结系列,感兴趣的朋友可以添加关注,欢迎指正、交流
119 0
【前端 · 面试 】HTTP 总结(二)—— HTTP 消息
|
域名解析 缓存 网络协议
HTTP 2.0 ,有点炸 !(一)
Hey guys ,各位小伙伴们大家好,这里是程序员 cxuan,欢迎你收看我最新一期的文章。
|
缓存 网络协议 算法
HTTP 2.1 ,有点炸 !(二)
Hey guys ,各位小伙伴们大家好,这里是程序员 cxuan,欢迎你收看我最新一期的文章。
HTTP 2.1 ,有点炸 !(二)
|
网络协议 区块链
重温HTTP,你到底做了什么?(下)
之前在回忆面试题的时候,面试官曾经问过我关于网络协议的一些东西,回答的当时感觉自己很垃圾,然后面试结束之后,自行百度,翻阅书籍,然后做了细致的整理,现在我就来分享给大家。
重温HTTP,你到底做了什么?(下)