【网络】HTTP 和 HTTPS

devtools/2025/3/26 11:09:33/

HTTP(HyperText Transfer Protocol)和 HTTPS(HTTP Secure)是互联网数据通信的核心协议,作为前端开发者,深入理解其原理和细节对性能优化、安全加固和问题排查至关重要。

一.HTTP核心概念

1.请求方法

GET : 获取数据。

一般用于获取静态资源或者调用查询类API,如搜索、分页列表等。

  • 参数位置:通过 URL 的 查询字符串(Query String) 传递,参数之间使用"&"连接,如 ?id=1&name=foo。
  • 可见性:参数明文暴露在 URL 和浏览器历史中。
  • 长度限制:受浏览器和服务器限制(通常 2KB~8KB)。
  • 幂等性:是(多次请求结果一致)。
  • 安全性:是(不修改服务器数据)。

幂等 指多次执行同一操作所产生的结果与执行一次的结果相同。

通俗理解:

电灯开关:按一次开关,灯亮;再按一次,灯灭。这不是幂等操作,因为结果会变化。

电梯的“关门”按钮:无论按多少次,最终结果都是门关闭。这是幂等操作。

由于字符串的可见性,所以要避免在URL中传递密码、token等敏感信息。

// 使用 Fetch API 发送 GET 请求
fetch('https://api.example.com/data?id=1').then(response => response.json());

POST : 提交数据

一般用于提交表单数据(登录、注册、文件上传),执行非幂等操作(创建新资源、触发支付)以及发送敏感信息(密码、支付信息)等。

  • 参数位置:通过请求体(Body)传递,支持多种格式(JSON、FormData、二进制等)。
  • 可见性:参数不可见(但仍需配合 HTTPS 保证安全)。
  • 无长度限制:由服务器配置决定。
  • 幂等性:否(多次提交会创建多个资源,如重复提交订单)。
  • 安全性:否(可能修改服务器数据)。
// 发送 JSON 格式的 POST 请求
fetch('https://api.example.com/users', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ name: 'Alice', age: 30 })
});

PUT :替换资源

一般用于替换整个资源。

  • 参数位置:请求体(通常为完整资源数据)。
  • 幂等性:是(多次替换同一资源,最终结果与一次替换相同)。
  • 安全性:否(修改数据)。
// 替换 ID 为 1 的用户数据
fetch('https://api.example.com/users/1', {method: 'PUT',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ name: 'Bob', age: 25 })
});

PUT 替换整个资源,PATCH 更新部分字段。

DELETE : 删除资源

一般用于删除指定资源(如用户、文章、订单)。

  1. 参数位置:通常通过 URL 路径指定资源 ID。
  2. 幂等性:是(删除不存在的资源仍返回相同结果)。
  3. 安全性:否(修改数据)。
// 删除 ID 为 1 的用户
fetch('https://api.example.com/users/1', {method: 'DELETE'
});

HEAD : 获取响应头(用于检查资源是否存在或更新)。

一般用于检查资源是否存在(如验证链接有效性)或者获取资源元数据(如文件大小、最后修改时间)。

  • 行为:与 GET 相同,但服务器不返回响应体。
  • 幂等性:是。
  • 安全性:是。
// 检查资源是否存在
fetch('https://api.example.com/data/1', { method: 'HEAD' }).then(response => {if (response.ok) console.log('资源存在');else console.log('资源不存在');});

https://i-blog.csdnimg.cn/direct/dcd154bec2c74b57a39f50d3f9b72a5f.png" width="962" />

2.状态码

当客户端发出请求时,服务器会返回三位数字,这三位数字就是状态码,状态码有五种:信息性响应、成功响应、重定向响应、客户端错误、服务器错误。

状态码第一位数字表示类别,后两位细化具体原因:

https://i-blog.csdnimg.cn/direct/194a9f8ed6774099b099531c50eb2c91.png" width="968" />

100:客户端应继续发送请求体(用于大文件上传前确认服务器是否接受)

200 :请求成功

201 :资源创建成功

301 :资源永久重定向,浏览器自动缓存跳转

302 :临时重定向

400 :请求参数错误

401 :未登录或token失效

403 :无权限访问(检查用户角色)

404 :资源不存在

500 :服务器错误(需连接后端)

3.请求头与响应头(高频使用)

类型字段前端关注点
请求头Content-Type声明请求体的格式(如 application/json)
Authorization携带 Token(如 Bearer xxx)
Cookie自动发送当前域下的 Cookie
响应头Access-Control-Allow-Origin解决跨域问题(需配置为前端域名或 *)
Cache-Control控制缓存策略(如 max-age=3600)
Set-Cookie服务器设置 Cookie(注意安全属性)

二.HTTPS 核心理解

1.为什么需要HTTPS?

HTTP 的缺陷:

明文传输:数据易被窃听(如密码、Cookie)。

无身份验证:可能遭遇中间人攻击(伪造服务器)。

数据篡改:传输内容可能被修改。

HTTPS 的优势:

加密:数据通过 TLS/SSL 加密,防止窃听。

身份认证:通过数字证书验证服务器身份。

完整性校验:防止数据被篡改。

2.HTTPS 实践

(1)本地开发

使用 webpack-dev-server 配置 HTTPS:

// webpack.config.js
module.exports = {devServer: {https: true, // 自动生成自签名证书// 或指定证书// https: { key: fs.readFileSync('key.pem'), cert: fs.readFileSync('cert.pem') }}
};

(2)生产环境

确保所有资源(图片、脚本、样式)使用 HTTPS 协议,避免混合内容(Mixed Content)错误。

使用 Content-Security-Policy 头限制不安全请求。

文章来源:https://blog.csdn.net/m0_59873661/article/details/146495362
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/devtools/171330.html

相关文章

力扣13. 罗马数字转整数:Java多种解法详解

力扣13. 罗马数字转整数:Java多种解法详解 题目描述 罗马数字由以下字符构成:I, V, X, L, C, D, M,分别对应数值1, 5, 10, 50, 100, 500, 1000。 特殊规则:当小值字符位于大值字符左侧时,表示减法(如 IV4…

linux0.11内核源码修仙传第九章——时间初始化

🚀 前言 本文主要解释了计算机断电重启后能准确读取时间的原因,内容很短,对应于书中的第17回。希望各位给个三连,拜托啦,这对我真的很重要!!! 目录 🚀 前言🏆…

【微服务架构】本地负载均衡的实现(基于随机算法)

前言 负载均衡 概念:一种将网络流量或业务请求均匀分配到多个服务器或服务实例上的技术,旨在提高系统的可用性、性能和可伸缩性。作用: 提高性能:通过将请求分散到多个实例上,避免单个实例因请求过多而过载&#xff…

GMII 接口

文章目录 概述硬件拓扑GMII 接口站管理接口发送数据时序接收数据时序参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记,文末均附有参考链接,如侵权,请联系删除。 概述 GMII 是千兆网的MII接口,这个也有相应的 RGMII 接口&…

笔试专题(三)

文章目录 字符串中找出连续最长的数字串题解代码 拼三角题解代码 字符串中找出连续最长的数字串 题目链接 题解 1. 考察双指针 模拟 2. 算法思路:给定一个i 0,让i,如果遇到数字字符就创建一个变量j i,让j去遍历&#xff0c…

Rust从入门到精通之进阶篇:20.项目实践

项目实践 在本章中,我们将把前面学到的所有 Rust 知识整合起来,构建一个完整的应用程序。通过实际项目,你将学习如何组织代码、处理依赖关系、实现功能以及测试和部署 Rust 应用程序。我们将构建一个命令行待办事项管理器(Todo CLI),它具有添加、列出、完成和删除任务的…

深入理解指针(2)(C语言版)

文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参的本质四、冒泡排序五、二级指针六、指针数组七、指针数组模拟二维数组总结 前言 在上一篇文章中,我们初步了解了指针的基本概念和用法。今天,我们将继续深入探索指针在数组、函数传…

Uniapp使用大疆SDK打包离线原生插件二

上一篇讲了如何下载及配置原生插件,今天深入的了解下如何将java代码的SDK引入Uniapp 一、配置libs: 在Android开发中,libs目录通常用于存放项目所需的第三方库文件。 将sdk中的包lib.5plus.base-release.aar、android-gif-drawable-release1.2.23.aa…