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

简介: 【青训营】-💗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感兴趣的同学可以再深入研究一下~

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

相关文章
|
8月前
|
人工智能 监控 安全
多领域实用工具,提升效率与协作的法宝
精选多领域实用工具,提升效率与协作。TinyTask:32KB轻量自动化工具,适合基础重复操作;Qdown:基于Aria2内核的全能下载器,内存占用仅30MB;燃精灵:微信空号检测软件,助你精准抓取潜在客户;Prezi:非线性动态演示工具,支持AI生成大纲与多人协作;向日葵:跨平台远程控制,提供安全高效的远程办公解决方案。善用这些工具,优化工作流程,释放生产力。
177 0
|
安全 搜索推荐 Android开发
安卓与iOS应用开发的对比分析
【8月更文挑战第20天】在移动应用开发领域,安卓和iOS两大平台各领风骚。本文通过深入探讨两者的开发环境、编程语言、用户界面设计、应用市场及分发机制等方面的差异,揭示了各自的优势和挑战。旨在为开发者提供决策支持,同时帮助理解为何某些应用可能优先选择在一个平台上发布。
215 2
|
缓存 NoSQL Java
Spring Boot 3 整合 Spring Cache 与 Redis 缓存实战
Spring Boot 3 整合 Spring Cache 与 Redis 缓存实战
|
9月前
|
存储 SQL 监控
转转平台IM系统架构设计与实践(二):详细设计与实现
以转转IM架构为起点,介绍IM相关组件以及组件间的关系;以IM登陆和发消息的数据流转为跑道,介绍IM静态数据结构、登陆和发消息时的动态数据变化;以IM常见问题为风景,介绍保证IM实时性、可靠性、一致性的一般方案;以高可用、高并发为终点,介绍保证IM系统稳定及性能的小技巧。
191 6
|
移动开发 监控 安全
HTML5 WebSocket详解
**WebSocket** 是一种协议,支持浏览器与服务器间的双向全双工通信。不同于传统的 HTTP 模式,WebSocket 建立持久连接,使服务器能主动向客户端推送数据。本文详细解析 WebSocket 的工作原理、优缺点及应用场景,并提供客户端和服务器端的代码示例。WebSocket 适合实时聊天、在线游戏、数据监控等场景,能显著提升用户体验和应用性能,但需注意其实现复杂性和安全性问题。
|
小程序
微信小程序scroll-view横向滚动和纵向滚动实现(亲测管用)
微信小程序scroll-view横向滚动和纵向滚动实现(亲测管用)
|
应用服务中间件 网络安全 nginx
处理 WebSocket 连接失败的最佳实践
WebSocket 目前已经成为了一项极为重要的技术,其允许客户端和服务器之间进行实时、全双工的通信。然而,在实际项目中,开发者时常会遇到 WebSocket 连接失败的情况。这不仅影响了用户体验,还可能导致不可预见的系统错误或数据丢失。那么,造成 WebSocket 连接失败的原因有哪些?又该如何解决这些问题呢?本文将逐一分析常见的 WebSocket 连接失败原因,并提供详细的解决方案。
|
SQL 存储 前端开发
【java】树形结构分页(真分页)
【java】树形结构分页(真分页)
404 1
|
传感器 存储 芯片
毕业设计 基于51单片机环境监测设计 光照 PM2.5粉尘 温湿度 2.4G无线通信
毕业设计 基于51单片机环境监测设计 光照 PM2.5粉尘 温湿度 2.4G无线通信
261 0