HTTP介绍以及(GET/POST/PUT/DELETE)应用介绍
WWW 是 “World Wide Web” 的缩写,中文名为 “万维网”。它是一个基于超文本和 HTTP 协议的全球性信息系统,通过互联网连接了世界各地的服务器和用户。用户可以使用浏览器访问各种网站,浏览网页、获取信息、进行交互等。
WWW 的核心技术包括 HTML(超文本标记语言)、URL(统一资源定位符)和 HTTP(超文本传输协议)等。HTML 用于创建网页内容,URL 用于定位网络上的资源,HTTP 则用于在客户端和服务器之间传输数据。
一、HTTP介绍
1. 定义
- HTTP 是一种应用层协议,用于客户端(如浏览器)和服务器之间的通信,支持传输文本、图片、视频等资源。
- 无状态协议:每次请求独立,服务器不保留客户端状态(需通过 Cookie/Session/JWT 等机制管理状态)。
2. 核心特点
- 请求-响应模型:客户端发起请求,服务器返回响应。
- 基于 TCP/IP:默认端口 80(HTTP)或 443(HTTPS)。
- 可扩展性:通过头部(Headers)自定义元数据。
3.版本演变
| 版本 | 发布时间 | 核心改进 |
|---|---|---|
| HTTP/0.9 | 1991 | 仅支持 GET 方法,无头部,响应纯文本。 |
| HTTP/1.0 | 1996 | 引入状态码、头部、多文件类型(MIME)支持。 |
| HTTP/1.1 | 1997 | 持久连接(Keep-Alive)、管道化(Pipelining)、分块传输(Chunked)。 |
| HTTP/2 | 2015 | 二进制协议、多路复用、头部压缩、服务器推送(Server Push)。 |
| HTTP/3 | 2022 | 基于 QUIC 协议(UDP 实现),解决队头阻塞,提升弱网环境性能。 |
二、HTTP 请求与响应结构
1. HTTP 请求(Request)
GET /index.html HTTP/1.1 // 请求行(方法 + 路径 + 协议版本)
Host: www.example.com // 头部字段
User-Agent: Mozilla/5.0
Accept: text/html// 空行分隔头部与请求体
[请求体](GET 请求通常无请求体)
2. HTTP 响应(Response)
HTTP/1.1 200 OK // 状态行(协议版本 + 状态码 + 状态文本)
Content-Type: text/html // 头部字段
Content-Length: 1024
Server: Apache/2.4.6<!DOCTYPE html> // 响应体
<html>...</html>
三、核心组成部分详解
1. HTTP 方法(Methods)
- 常用方法:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS。
- 幂等性:多次请求结果相同(如 GET、PUT、DELETE)。
- 安全性:不修改服务器资源(如 GET、HEAD)。
2. 状态码(Status Codes)
| 分类 | 范围 | 常见状态码 | 说明 |
|---|---|---|---|
| 1xx | 100-199 | 100 Continue | 请求已接收,客户端继续发送。 |
| 2xx | 200-299 | 200 OK201 Created | 请求成功。 |
| 3xx | 300-399 | 301 Moved Permanently304 Not Modified | 重定向或缓存未修改。 |
| 4xx | 400-499 | 400 Bad Request404 Not Found | 客户端错误。 |
| 5xx | 500-599 | 500 Internal Server Error503 Service Unavailable | 服务端错误。 |
3. 头部(Headers)
- 通用头部:
Cache-Control: max-age=3600 // 缓存控制 Connection: keep-alive // 保持连接 - 请求头部:
Authorization: Bearer <token> // 身份验证 Accept-Encoding: gzip // 支持的压缩格式 - 响应头部:
Set-Cookie: sessionId=abc123 // 设置 Cookie Content-Encoding: gzip // 响应体压缩方式
- 实体头部:
Content-Type: application/json // 数据类型 Content-Length: 1024 // 数据长度
4. Cookie 和 Session
- Cookie:由服务器通过
Set-Cookie头部设置,客户端存储并在后续请求中自动携带。 - Session:服务器存储的用户会话数据,通常通过 Cookie 中的 Session ID 关联。
5.HTTP 与 HTTPS 的区别
| 特性 | HTTP | HTTPS(HTTP over TLS/SSL) |
|---|---|---|
| 安全性 | 明文传输,易被窃听或篡改。 | 加密传输(对称加密 + 非对称加密)。 |
| 端口 | 80 | 443 |
| 性能 | 无加密开销,更快。 | 加密/解密增加延迟,但可通过硬件优化。 |
| 证书 | 无需证书。 | 需 CA 颁发的 SSL 证书。 |
| SEO 影响 | 无特殊优化。 | 被搜索引擎优先收录。 |
四、性能优化技巧
-
减少请求次数:
- 合并 CSS/JS 文件(Webpack 等工具)。
- 使用雪碧图(CSS Sprites)。
-
压缩传输内容:
- 启用 Gzip/Brotli 压缩(通过
Content-Encoding头部)。 - 图片使用 WebP 格式。
- 启用 Gzip/Brotli 压缩(通过
-
利用缓存:
- 设置强缓存(
Cache-Control: max-age=31536000)。 - 协商缓存(
Last-Modified和ETag)。
- 设置强缓存(
-
HTTP/2 特性:
- 多路复用替代 HTTP/1.1 的管道化,解决队头阻塞。
- 服务器推送(提前推送关键资源如 CSS 文件)。
五、安全防护措施
-
防御 XSS(跨站脚本攻击)对用户输入进行转义(如
<转义为<)。设置Content-Security-Policy头部限制资源加载来源。 -
防御 CSRF(跨站请求伪造):使用 CSRF Token 验证请求来源。设置
SameSite属性限制 Cookie 发送范围。 -
防止信息泄露:隐藏服务器版本信息(如
Server头部)。禁用目录遍历(如 Apache 中Options -Indexes)。 -
HTTPS 强制升级:通过 HSTS(HTTP Strict Transport Security)头部强制使用 HTTPS。
Strict-Transport-Security: max-age=31536000; includeSubDomains
六、GET/POST/PUT/DELETE介绍
1、GET
定义
- 用于从服务器获取资源(数据)。
- 幂等且安全:多次请求不会改变服务器状态,且仅用于读取操作。
特点
- 参数传递:通过 URL 的查询参数(Query String)传递,如
?id=1&name=foo。 - 缓存支持:可被浏览器缓存,提高性能。
- 可见性:参数直接暴露在 URL 中,不适合敏感数据传输。
使用场景:查询用户列表、获取文章详情、搜索数据等读取操作。
GET /api/users?id=1 HTTP/1.1
Host: example.com
注意事项
- 不要用 GET 修改数据(如删除或更新操作)。
- URL 长度受浏览器限制(通常 2KB~8KB)。
2、POST
定义
-
用于向服务器提交数据(通常创建新资源)。
-
非幂等且不安全:多次请求可能产生不同结果(如重复提交订单)。
特点
-
参数传递:通过请求体(Body)传递,支持 JSON、FormData 等格式。
-
无缓存:默认不会被浏览器缓存。
-
安全性:适合传输敏感数据(如密码、文件上传)。
使用场景:用户注册、提交表单、上传文件等创建资源操作。
请求示例
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json{"name": "Alice","email": "alice@example.com"
}
注意事项
- 需明确设置
Content-Type(如application/json)。 - 后端需验证数据合法性(防 SQL 注入、XSS 攻击等)。
3、PUT
定义
-
用于完整更新服务器上的资源(需提供全部字段)。
-
幂等但非安全:多次请求结果一致(如重复更新同一资源)。
特点
-
参数传递:通过请求体传递完整资源数据。
-
覆盖性更新:需提交资源的所有字段(缺失字段会被置空)。
使用场景:更新用户全部信息、替换文档内容等完整覆盖操作。
请求示例
PUT /api/users/1 HTTP/1.1
Host: example.com
Content-Type: application/json{"name": "Alice Updated","email": "alice_updated@example.com"
}
注意事项
-
若仅需更新部分字段,应使用 PATCH 方法。
-
需验证资源是否存在(如 ID 有效性)。
4、DELETE
定义
-
用于删除服务器上的资源。
-
幂等但非安全:多次请求结果一致(如重复删除同一资源)。
特点
-
无请求体:通常通过 URL 标识要删除的资源。
-
无缓存:需确保删除操作成功后再刷新前端状态。
使用场景:删除用户、移除订单、清理临时文件等删除操作。
请求示例
DELETE /api/users/1 HTTP/1.1
Host: example.com
注意事项
-
删除前需确认权限(如用户是否有权删除)。
-
可设计软删除(标记
is_deleted字段而非物理删除)。
5.GET/POST/PUT/DELETE比对
| 方法 | 幂等性 | 安全性 | 请求体是否允许 | 典型状态码 | 常见用途 |
|---|---|---|---|---|---|
| GET | 是 | 是 | ❌ | 200 OK | 查询数据 |
| POST | 否 | 否 | ✔️ | 201 Created | 创建资源 |
| PUT | 是 | 否 | ✔️ | 200 OK / 204 No Content | 完整更新资源 |
| DELETE | 是 | 否 | ❌ | 200 OK / 204 No Content | 删除资源 |
- 语义:
GET用于获取资源,PUT用于更新资源,POST用于创建资源,DELETE用于删除资源。 - 幂等性:
GET和PUT是幂等的,多次执行相同的GET或PUT请求,结果相同。POST不是幂等的,多次提交可能会创建多个资源。DELETE在大多数情况下是幂等的,多次删除同一资源,最终结果是资源被删除。 - 参数传递:
GET请求的参数通过 URL 传递,数据可见且有长度限制。POST请求的参数通常放在请求体中,数据不可见且无长度限制。PUT和DELETE与POST类似,参数可放在请求体中,但PUT一般用于更新完整资源,DELETE用于指定资源的删除。 - 安全性:
GET请求被认为是安全的,因为它只用于获取数据,不会对服务器资源产生副作用。POST、PUT和DELETE会对服务器资源进行修改,不具有安全性。
七、RESTful API 设计原则
-
资源命名:
- 使用名词(如
/users),而非动词(如/getUsers)。 - 复数形式表示集合(如
/users/1表示单个用户)。
- 使用名词(如
-
状态码规范:
200 OK:请求成功。201 Created:资源创建成功。400 Bad Request:客户端请求错误。404 Not Found:资源不存在。500 Internal Server Error:服务端错误。
-
幂等性与安全性:
- 幂等性(多次请求结果一致)对重试机制非常重要(如网络超时后自动重试 PUT/DELETE)。
- 安全性(不修改资源状态)是 GET 方法的核心特性。
八、实际代码示例
前端(React + Axios)
// GET 请求
axios.get('/api/users/1').then(response => console.log(response.data));// POST 请求
axios.post('/api/users', { name: "Bob" }).then(response => console.log(response.data));// PUT 请求
axios.put('/api/users/1', { name: "Bob Updated" }).then(response => console.log(response.data));// DELETE 请求
axios.delete('/api/users/1').then(response => console.log('Deleted'));
后端(Spring Boot)
// GET
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {return ResponseEntity.ok(userService.findById(id));
}// POST
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {return ResponseEntity.status(HttpStatus.CREATED).body(userService.save(user));
}// PUT
@PutMapping("/users/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {return ResponseEntity.ok(userService.update(id, user));
}// DELETE
@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {userService.delete(id);return ResponseEntity.noContent().build();
}
相关文章:
HTTP介绍以及(GET/POST/PUT/DELETE)应用介绍
WWW 是 “World Wide Web” 的缩写,中文名为 “万维网”。它是一个基于超文本和 HTTP 协议的全球性信息系统,通过互联网连接了世界各地的服务器和用户。用户可以使用浏览器访问各种网站,浏览网页、获取信息、进行交互等。 WWW 的核心技术包…...
圆球法线图,图生法线图 图片生成法线图
目录 圆球法线图 根据图片生成法线图 深度图计算法线图 圆球法线图 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D# 定义球体的参数 radius 1.0 resolution 100# 生成球体表面的点 u np.linspace(0, 2 * np.pi, resoluti…...
notepad++ 正则表达式
注意:Notepad正则表达式字符串最长不能超过69个字符 \ 转义字符 如:要使用 “\” 本身, 则应该使用“\\” \t Tab制表符 注:扩展和正则表达式都支持 \r 回车符CR 注:扩展支持,正则表达式不支持 \n 换行符…...
Java基于SpringBoot的网络云端日记本系统,附源码+文档说明
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
【自用记录】本地关联GitHub以及遇到的问题
最近终于又想起GitHub,想上传代码和项目到仓库里。 由于很早之前有在本地连接过GitHub(但没怎么用),现在需要重新搞起(操作忘得差不多)。 在看教程实操的过程中遇到了一些小问题,遂记录一下。 前…...
页码设置相关问题记录
Q:中间没有显示页码怎么办? A:“页眉和页脚”-“页码”-“页面底端”-“普通数字2” Q:想让页码在某几节连续怎么办? A: ① 先保证节与节之间插入了“分节符”(如何插入分节符和如何显示分节符…...
什么是数据集市
数据集市(Data Mart)是数据管理领域的核心概念,其定义为面向特定业务领域或用户群体的小型数据仓库子集,专注于部门级业务分析,具有快速响应、灵活部署等特点。以下从定义、特点、类型、结构、应用场景及与其他数据架构…...
Python 的未来:在多元变革中持续领跑
一、从工具到生态:Python 的核心优势筑牢发展根基 Python 自诞生以来,始终以 “简洁易用” 和 “跨界融合” 为标签,在技术快速迭代的时代展现出惊人的韧性。其核心竞争力不仅在于语法的直观性 —— 让开发者专注于逻辑实现而非语法细节&…...
【HC-05蓝牙模块】主要性能指标与通信基础知识
一、HC-05 基础学习视频 HC-05蓝牙串口通信模块调试与应用1 二、HC-05学习视频课件...
深度学习中的数据类型
1. NumPy 数组 (numpy.ndarray) 核心定位:科学计算的基础工具,处理数值多维数组。 特点: 高效数值运算:底层用 C 实现,适合数学计算(如矩阵乘法、傅里叶变换)。 内存连续存储:数据…...
如何缩短研发周期,降低研发成本?全星APQP软件为您提供解决方案
如何缩短研发周期,降低研发成本?全星APQP软件为您提供解决方案 一、 系统概述 全星研发管理APQP软件系统是一款专为产品研发和质量管控打造的智能化平台,旨在帮助企业高效推进APQP(先期产品质量策划)流程,…...
嵌入式系统安全架构白皮书
嵌入式系统安全架构白皮书 一、安全威胁模型 1.1 典型攻击面分析 #mermaid-svg-mxWZ8IOtOmMv6YLV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mxWZ8IOtOmMv6YLV .error-icon{fill:#552222;}#mermaid-svg-mxWZ8I…...
MQTT之重复消息(5、TCP重连和MQTT重连)
目录 1. TCP 协议层的重传(原生机制) 2. 触发 TCP 重传的具体场景 3、TCP 重传的关键参数(了解) 第一、重传超时(RTO - Retransmission Timeout) 第二、重传次数 第三、累计时间 vs 本次 RTO 的区别 第四.常见问题解答 第…...
Github Webhook 以及主动式
Github配置 GitHub 默认支持两种 Content-Type: application/json application/x-www-form-urlencoded 特别要注意 Content-Type 我们选择: application/json Flask代码 import os import shutil import subprocess from flask import Flask, request, jsonifyapp = Fla…...
猜猜我用的是哪个大模型?我的世界游戏界面简单的模拟效果
我的罗里吧嗦的,根据小朋友的要求,边听边写边输入的提示词: 请生成一段完整的在网页中用html5和javascript代码模拟“我的世界”中游戏场景的互动画面,要求提供若干人物选项可以选择,请自行选择需要使用哪些库或框架来…...
基于龙芯3A5000处理器,全国产标准6U VPX板卡解决方案
1,产品功能 本产品为一款高可靠性的基于龙芯3A5000处理器以及 7A2000芯片组的标准6U VPX板卡,具有以太网、SATA、PCIE,以及显示等接口,产品功能框图如图1所示: 图1 系统框图 2,技术指标 序号 项目 指标…...
Unity编辑器功能及拓展(3) —[Attribute]特性
在 Unity 中,[Attribute]格式的特性是用于扩展编辑器功能、控制序列化行为和调整 Inspector 显示,进行编辑器拓展的核心工具。 一.基础编辑器拓展 1.基础序列化控制 1.[SerializeField] 强制显示私有变量到Inspector 2.[HideInInspector] 隐藏该字段在Inspect…...
每日一题之既约分数
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。 例如 3/4,1/8,7/1, 都是既约分数。 请问,有多少个既约分…...
C++作用域辨识详解
在 C 中,作用域(Scope)定义了变量、函数、类等标识符的可见性和生命周期。理解作用域对于编写清晰、高效的代码至关重要。以下是 C 中作用域的详细分类和说明。 1. 全局作用域(Global Scope) 全局作用域是指在所有函…...
wait的概念和使用方法
在C语言中,wait 函数主要用于进程管理,它是一个系统调用,定义在 <sys/wait.h> 头文件中,用于让父进程等待其子进程结束,并获取子进程的终止状态。下面为你详细介绍其概念和使用方法。 概念 wait 函数的原型如下…...
HarmonyOS NEXT——鸿蒙神策埋点(二)
在上一章我分享了鸿蒙客户端集成神策埋点sdk的过程,现在我们需要服务端的小伙伴配置集成服务端sdk接收处理数据信息,以下是集成的过程。 Java服务端sdk集成 1、获取神策数据平台url地址 1、导入集成: dependencies {compile com.sensorsda…...
编程考古-Borland JBuilder:一场关于Java灵魂的战争与救赎
本文也是填之前一位网友让谈谈JBuilder的一个坑,感谢各位技术爱好者的支持。感谢关注小编,你的关注,是我更新的动力。 本篇章节如下: 序章:JBuilder的黄金时代 Borland的JBuilder:纯技术主义的胜利 生死…...
【day4】数据结构刷题 树
6-1 二叉树的遍历 函数接口定义: void InorderTraversal( BinTree BT ); void PreorderTraversal( BinTree BT ); void PostorderTraversal( BinTree BT ); void LevelorderTraversal( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Po…...
Elea AI:以人工智能之力推动病理实验室革新的技术突破与实践探索
Elea AI:以人工智能之力推动病理实验室革新的技术分析 一、病理实验室现状与 Elea AI 的革新契机 (一)传统病理实验室的痛点剖析 在医疗体系中,病理实验室扮演着至关重要的角色,其诊断结果是疾病确诊与后续治疗方案制定的关键依据。然而,当前传统病理实验室在实际运作过…...
相似度计算 ccf-csp 2024-2-2
#include<bits/stdc.h> using namespace std;int main() {// 定义两个变量 n 和 m,分别用于存储两篇文章的单词个数int n, m;// 从标准输入读取 n 和 m 的值cin >> n >> m;// 定义三个 map 容器,A 用于存储并集,T 用于标记…...
多省发布!第27届中国机器人及人工智能大赛各赛区比赛通知
01 大赛介绍 中国机器人及人工智能大赛是由中国人工智能学会主办的极具影响力的全国性学科竞赛,旨在推动我国机器人及人工智能技术的创新与应用,促进相关专业的人才培养。作为全国高校学科竞赛A类赛事,该比赛吸引了众多高校和科研机构的积极…...
【Kafka】从理论到实践的深度解析
在当今数字化转型的时代,企业面临着数据量呈指数级增长、业务系统愈发复杂的挑战。在这样的背景下,高效的数据传输与处理技术成为了关键。Kafka,作为一款分布式消息队列系统,凭借其卓越的性能和丰富的特性,在众多企业的…...
对锁进行封装
目录 锁的封装 makefile编写 测试运行 RAII式封装 我们今天学习对锁进行封装。 我们在命名空间里面,在自己构建的类mutex里面完成对锁的封装。 锁的封装 我们要进行动态初始化锁,首先要有一个锁对象,所以mutex类里面的私有成员就是锁对…...
【学Rust写CAD】18 定点数2D仿射变换矩阵结构体(MatrixFixedPoint结构别名)
源码 // matrix/fixed.rs use crate::fixed::Fixed; use super::generic::Matrix;/// 定点数矩阵类型别名 pub type MatrixFixedPoint Matrix<Fixed, Fixed, Fixed, Fixed, Fixed, Fixed>;代码解析 这段代码定义了一个定点数矩阵的类型别名 MatrixFixedPointÿ…...
C++Primer学习(14.1 基本概念)
当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义。明智地使用运算符重载能令我们的程序更易于编写和阅读。举个例子,因为在Sales_item类中定义了输入、输出和加法运算符,所以可以通过下述形式输出两个Sales_item…...
