当前位置: 首页 > news >正文

重生之我要学后端0--HTTP协议和RESTful APIs

http和RESTful APIs

  • HTTP协议
  • RESTful APIs设计
  • RESTful API设计实例

HTTP协议

HTTP(超文本传输协议)是用于分布式、协作式和超媒体信息系统的应用层协议。它是网页数据通讯的基础。工作原理简述如下:

  1. 客户端请求(Request):当你在浏览器中输入一个URL或点击一个链接时,浏览器会向服务器发送一个HTTP请求。这个请求包括:
  • 请求行:包含方法(如GET, POST, PUT, DELETE等)、请求资源的URI和HTTP版本。
  • 请求头部:包含表示浏览器类型、接受的内容类型、连接方式等的元数据。
  • 空行:指示头部结束。
  • 可选的请求正文:对于POST或PUT请求,正文中包含要发送给服务器的数据。
    在这里插入图片描述
    在这里插入图片描述
这确实是一个HTTP请求的请求行和请求头,它看起来是一个WebSocket握手请求。
WebSocket是一种在单个TCP连接上进行全双工通讯的协议。这个特定的请求正在试图从标准的HTTP协议升级到WebSocket协议。这里是请求的一些关键组成部分解释:GET ws://localhost:5173/ros HTTP/1.1:这个请求行指出客户端希望发起的是一个GET请求,
使用的是HTTP/1.1协议。
而ws://localhost:5173/ros表示客户端尝试通过WebSocket协议与服务器建立连接,
并且目标资源是/ros。Host: localhost:5173:Host头部告诉服务器客户端想要连接的主机名和端口号。Connection: Upgrade:这表明客户端希望升级连接的协议。Upgrade: websocket:这告知服务器客户端想要升级到WebSocket协议。Sec-WebSocket-Version: 13:表示客户端支持的WebSocket版本。Sec-WebSocket-Key: 是经过Base64编码的随机值,
服务器会用这个值来构造一个响应头Sec-WebSocket-Accept,以完成握手。Sec-WebSocket-Extensions: 表示客户端支持的WebSocket扩展。由于WebSocket协议的握手是基于HTTP协议进行的,所以初始的握手请求遵循HTTP请求格式,
但是之后的数据传输则不再遵循HTTP协议,而是采用WebSocket自己定义的帧格式进行数据交换。该请求没有请求正文(Body)部分,因为WebSocket握手请求通常不需要正文;
握手的所有必要信息都包含在请求头中。如果服务器接受握手,则会返回一个状态码101的响应,
表示协议切换,然后客户端和服务器之间就可以开始WebSocket协议的数据交换了。

在这里插入图片描述
标头是请求头和响应头,载荷是请求体(如果是get请求不显示),响应是响应体。

  1. 服务器响应(Response):服务器接收并处理客户端的请求后,返回一个HTTP响应。这个响应包括:
  • 状态行:包含所使用的HTTP版本、状态码(如200 OK, 404 Not Found等)和状态消息。
  • 响应头部:包含服务器类型、内容类型、编码、缓存控制等信息。
  • 空行:指示头部结束。
  • 可选的响应正文:包含请求的资源内容,例如HTML页面、图像等。
    在这里插入图片描述
    在这里插入图片描述
  1. 连接管理:按照HTTP/1.1协议,默认情况下,一次TCP连接可以发送多个HTTP请求(持久连接),提高了效率。而HTTP/2进一步优化了这些概念,支持同时多个请求/响应(多路复用)。

RESTful APIs设计

REST(表现层状态转移)是一种软件架构风格,它提倡网络应用程序的客户端和服务器之间的交互应该是无状态的,且可以通过标准的HTTP方法进行。遵循REST原则设计的Web服务称为RESTful API。核心原则包括:

  • 无状态(Statelessness):每个请求都包含了执行该请求所需的所有信息。服务器不需要保存客户端的状态。
  • 客户端-服务器(Client-Server):客户端和服务器之间的关注点分离,使得两者可以独立地发展和扩展。
  • 可缓存(Cacheable):服务器响应必须定义自己是否可以被缓存。
  • 统一接口(Uniform Interface):保证了系统解耦和简单性。
  • 分层系统(Layered System):通过层来构建分布式系统,每一层只知道与其直接相连的层。
  • 按需代码(Code on Demand,可选):可以通过向客户端发送可执行代码来扩展客户端功能(比如JavaScript脚本)。

RESTful API设计的几个关键点:

  • 资源(Resources):API应该围绕资源构建,资源由URI唯一标识。
  • HTTP方法(Methods):使用标准的HTTP方法如GET(读取)、POST(创建)、PUT(更新/全替换)、PATCH(更新/部分替换)、DELETE(删除)进行操作。
  • 状态码(Status Codes):利用HTTP状态码来表示操作结果,例如200(成功)、201(已创建)、400(错误请求)、404(未找到)等。
  • 表示(Representation):资源的表现形式通常是JSON或XML格式,在HTTP的请求和响应的正文中传输。
  • 超媒体(Hypermedia):RESTful API应该提供资源的关联信息,如链接到其他相关资源。

RESTful API设计实例

假设我们有一个用户管理系统,我们可能会设计以下API:

  • 获取用户列表: GET /users
  • 创建新用户: POST /users
  • 获取指定用户: GET /users/{id}
  • 更新用户信息: PUT /users/{id}
  • 删除用户: DELETE /users/{id}

在实际设计中,你还需要考虑版本控制、认证、权限校验、分页和过滤等多方面因素。

总结起来,了解HTTP协议的基本工作原理以及如何遵循REST原则设计API是成为后端开发者的重要技能。

相关文章:

重生之我要学后端0--HTTP协议和RESTful APIs

http和RESTful APIs HTTP协议RESTful APIs设计RESTful API设计实例 HTTP协议 HTTP(超文本传输协议)是用于分布式、协作式和超媒体信息系统的应用层协议。它是网页数据通讯的基础。工作原理简述如下: 客户端请求(Request&#xf…...

深度之眼(二十八)——神经网络基础知识(三)-卷积神经网络

文章目录 一、前言二、卷积操作2.1 填充(padding)2.2 步长2.3 输出特征图尺寸计算2.4 多通道卷积 三、池化操作四、Lenet-5及CNN结构进化史4.1 Lenet-5 一、前言 卷积神经网络–AlexNet(最牛)-2012 Lenet-5-大规模商用(1989) 二、…...

AI Infra简单记录

向量数据库的作用 1. 在AI大模型训练过程中,向量数据库可以有效提升数据检索、特征提取等任务的效率。 2、在AI大模型推理过程中,向量数据库为大模型提供外挂知识库,提升模型时效性与准确性,提供缓存能力,减少调用开…...

三英战吕布 | 第5集 | 温酒斩华雄 | 竖子不足与谋 | 三国演义 | 逐鹿群雄

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 📌这篇博客分享的是《三国演义》文学剧本第Ⅰ部分《群雄逐鹿》的第5️⃣集《三英战吕布》的经典语句和文学剧本全集台词 文章目录 1.经典语句2.文学剧本台…...

【C语言】自定义类型:结构体

目录 1. 结构体类型的声明 1.1. 结构的一般声明 1.2. 结构的特殊声明 2. 结构体变量的创建和初始化 3. 结构体的自引用 4. 结构体内存对齐 4.1. 对其规则(面试考点) 4.2. 为什么存在内存对齐? 4.2.1. 平台原因(移植…...

算法金 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost 算法大全

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 决策树是一种简单直观的机器学习算法,它广泛应用于分类和回归问题中。它的核心思想是将复杂的决策过程分解成一系列简单的决…...

[每周一更]-(第103期):GIT初始化子模块

文章目录 初始化和更新所有子模块分步骤操作1. 克隆包含子模块的仓库2. 初始化子模块3. 更新子模块 查看子模块状态提交子模块的更改处理子模块路径错误的问题 该问题的缘由是因为:在写某些代码的时候,仓库中有些文件夹,只提交了文件夹名称到…...

单例模式---线程安全实现

文章目录 1.单例模式的特点😊2.单例模式两种实现🤣🤗😊2.1 饿汉式2.2 懒汉式 3.传统单例模式的线程安全问题4.解决方法4.1静态局部变量4.2加锁4.3双重检查锁(DCL)4.4pthread_once 1.单例模式的特点&#x1…...

Agent技术在现代软件开发与应用中的探索

一、引言 随着计算机科学的快速发展,Agent技术作为人工智能和分布式计算领域的重要分支,已经渗透到软件开发的各个方面。Agent技术通过赋予软件实体自主性和交互性,使得软件系统能够更加智能、灵活地响应环境变化和用户需求。本文将对Agent技…...

c语言中extern定义和引用其他文件的变量,(sublime text)单独一个文件编译不会成功

关键字extern的作用 这个很常见的都知道是定义一个外部变量或函数,但并不是简单的建立两个文件,然后在用extern 定义在另一个非最初定义变量的文件里 区分文件和编译运行的文件 例如,一个文件夹里有文件a.c和文件b.c,在sublime text中直接…...

时序数据中的孤立野点、异常值识别及处理方法

目录 参考资料 对时序数据做差分; 参考资料 [1] 离群点(孤立点、异常值)检测方法 2017.6;...

JetBrains PyCharm 2024 mac/win版编程艺术,智慧新篇

JetBrains PyCharm 2024是一款功能强大的Python集成开发环境(IDE),专为提升开发者的编程效率和体验而设计。这款IDE不仅继承了前代版本的优秀特性,还在多个方面进行了创新和改进,为Python开发者带来了全新的工作体验。 JetBrains PyCharm 20…...

MCU解决800V电动汽车牵引逆变器的常见设计挑战的3种方式

电动汽车 (EV) 牵引逆变器是电动汽车的。它将高压电池的直流电转换为多相(通常为三相)交流电以驱动牵引电机,并控制制动产生的能量再生。电动汽车电子产品正在从 400V 转向 800V 架构,这有望实现: 快速充电 – 在相同…...

《逆向投资 邓普顿的长赢投资法》

接下来跟大家一起学习《逆向投资 邓普顿的长赢投资法》。邓普顿被誉为20世纪最伟大的选股人之一,我非常确信林奇在他的《战胜华尔街》里也提到了邓普顿,可惜实在想不起来林奇是怎么形容邓普顿的。 邓普顿拥有70多年的投资生涯,在他晚年时曾总…...

C++中main函数的参数、返回值分别什么意思?main函数返回值跟普通函数返回值一样吗?

在C中,main函数是程序的入口点,即程序开始执行的地方。main函数可以有两种形式的签名(signature): 标准的main函数,不接受任何参数,也不返回任何值: int main() {// 代码... }带有参…...

Java程序员学习Go开发Higress的WASM插件

Java程序员学习Go开发Higress的WASM插件 契机 ⚙ 今年天池大赛有higress相关挑战,研究一下。之前没搞过go,踩了很多坑,最主要的就是tinygo打包,多方寻求解决无果,结论是tinygo0.32go1.19无法在macos arm架构下打包。…...

Python入门-基本数据类型-数字类型

数字类型是指表示数字或者数值的数据类型。在Python语言中,数字类型有整型(int)、 浮点型(float)、复数型(complex),对应数学中的整数、小数和复数,此外还有一种特殊 的整型,即布尔型(bool)。本节将对这4种数字类型进行详细介绍。…...

小程序web-view无法打开该页面的解决方法

问题:开发者工具可以正常打开,正式上线版小程序使用 web-view 组件测试时提示:“无法打开该页面,不支持打开 https://xxxxxx,请在“小程序右上角更多->反馈与投诉”中和开发者反馈。” 解决方法:需要配…...

海外媒体发稿:媒体宣发套餐的作用分享-华媒舍

一、神奇媒体宣发套餐 神奇媒体宣发套餐是一项专业的多媒体宣传推广服务,旨在帮助企业、个人快速提升品牌知名度和曝光度。它通过全面覆盖主流媒体、社交网络以及各大网络平台,将您的宣传信息传递给广泛的受众群体,实现全方位、多角度的宣传…...

【R语言】plot输出窗口大小的控制

如果需要输出png格式的图片并设置dpi,可采用以下代码 png("A1.png",width 10.09, height 10.35, units "in",res 300) 为了匹配对应的窗口大小,在输出的时候保持宽度和高度一致即可,步骤如下: 如上的“10…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...