HTTP实用指南| 青训营

179 阅读8分钟

一、初识HTTP

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

20210823_140825.gif 这是一个可以无限难的问题。出这个题目的目的就是为了考察你的 web 基础深入到什么程度。介于这篇文章主要是介绍HTTP的相关知识,这里就把重要的过程描述一下~
具体可参考(1.6w字)浏览器灵魂之问,请问你能接得住几个?

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

image.png

1.1 什么是HTTP

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

image.png

image.png

二、协议分析

2.1 发展

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

image.png

2.2 HTTP报文结构

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

image.png

起始行

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

POST / HTTP/1.1

也就是方法 + 路径 + http版本
对于响应报文来说,起始行类似下面这样:

HTTP/1.1 403 Forbidden

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

头部

image.png

image.png

空行

实体(数据部分)

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

Method

image.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表示操作类型。

restful API1.png

Restful API2.png

常见请求头

image.png

常见响应头

image.png

缓存

image.png

image.png

cookie

Set-Cookie -response

image.png

2.3 HTTP/2概述:

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

image.png

消息:与逻辑请求或响应消息对应的完整的一系列帧。
数据流:已建立的连接内的双向字节流,可以承载一条或多条信息。
交错发送,接收方重组织 image.png HTTP/2连接都是永久的,而且仅需要每个来源一个连接
流控制:阻止发送方向接收方发送大量数据的机制
服务器推送 image.png

2.4HTTPS概述

HTTPS是经过TSL/SSL加密

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

image.png

三、场景分析

3.1 静态资源

image.png

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

我们来看一下响应头: image.png cache-control这个指定了过期时间,与强缓存相关。
last-modified指定了最后修改时间,与协商缓存相关。
access-control-allow-origin允许哪些origin能访问我们,与同源策略有关。
content-type指定了实体数据的类型

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

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

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

3.2 登录

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

Response Headers: image.png

Request Headers: image.png

  1. 向什么地址做了什么动作?
  • 使用POST方法
  • 目标域名 juejin.cn
  • 目标path/passport/web/sms_login/?account_sdk_source=web
  1. 携带了哪些信息,返回了哪些信息

    1. 携带信息

      • Post body,数据格式为form
      • 希望获取的数据格式为json
      • 已有的cookie
    2. 返回信息

      • 数据格式json
      • 种cookie的信息

鉴权

image.png

3.3 视频播放

image.png

image.png

视频直播协议

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

3.4 文件上传

image.png 主流方案: image.png

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

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

image.png

跨域解决方案

  • CORS

  • 代理服务器

    • 同源策略是浏览器的安全策略,不是HTTP的
  • iframe

    • 诸多不便

四、实战

AJAX之XHR

image.png

AJAX之Fetch

image.png

标准库:HTTP/HTTPS

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

image.png

常用的请求库:axios

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

image.png

用户体验

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

网络优化: image.png 稳定性:

image.png

五、扩展

5.1 通信方式

WebSocket

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

image.png QUIC:Quic UDP Internet Connection

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

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

六、总结

通过学习前端HTTP实用指南,我深刻认识到了HTTP协议在现代Web开发中的关键地位以及它对于构建高性能、安全和可靠的Web应用的重要性。HTTP是连接前端与后端的桥梁,它影响着用户体验、数据传输以及应用的整体性能,以下是我在学习过程中的总结。

首先,我深入了解了HTTP协议的工作原理和基本概念。学习了HTTP请求、响应、状态码、头部信息等内容,使我能够更好地理解客户端和服务器之间的通信过程。了解了HTTP的无状态性和无连接性,这促使我意识到在开发过程中需要通过Cookie、Session、Token等机制来管理用户状态。

进一步,我了解了HTTP的缓存机制,这是提升性能的关键一环。学习了缓存策略、ETag、Last-Modified等概念,我知道如何在请求和响应中设置适当的头部信息来控制缓存,从而减少不必要的数据传输,提高页面加载速度。

总体而言,学习了前端HTTP实用指南是一次非常有价值的经历。通过深入学习和实践,我不仅获得了关于HTTP协议的广泛知识,还在实际项目中更好地应用了这些知识,提升了自己的前端开发技能。我相信这些知识将在我的职业生涯中发挥重要作用,帮助我构建更高效、安全和出色的Web应用,为用户提供更好的在线体验。