从简单 Rocket 实现到 RESTful API:计算机网络中的 Web 通信解析

server/2025/3/14 17:28:05/

在现代 Web 开发中,后端框架扮演着连接客户端与服务器的关键角色,而计算机网络则是支撑这一交互的核心基础。Rust 语言的 Rocket 框架 作为一款高性能的 Web 框架,为开发者提供了简洁高效的 HTTP 处理能力,使得构建 RESTful API 变得更加安全和易于维护。

然而,许多开发者在使用 Web 框架时,往往只关注业务逻辑,而忽略了其背后的网络通信机制。

那么,在 Rocket 框架中,一个 HTTP 请求是如何到达服务器的?它如何在 TCP/IP 协议栈 之上解析、处理并返回响应?RESTful API 在网络通信中的核心原则是什么?本文将从 计算机网络 的角度,结合 Rocket 框架,深入解析 HTTP、TCP 连接管理等关键概念。

关于RUST的基础语法:RUST基础学习

Rocket框架

先从一个简单的例子看起,创建一个rust项目:

cargo new hello-rocket

使用tree查看其构成,可以看到目录如下,main.rs为该项目的主函数:

zxy@ubuntu:~/Desktop/hello-rocket$ tree
.
├── Cargo.toml
└── src└── main.rs1 directory, 2 files

Cargo.toml为rust项目的配置文件,在该文件中添加rocket框架的dependencies

[dependencies]
rocket = { version = "0.5.0-rc.4"}

在main.rs中添加:

这段代码是一个使用 Rocket 框架 编写的 Rust 最小化 Web 服务器,它能够响应 HTTP GET / 请求并返回 "Hello, world!"

use rocket::{Request, Response};//用于 HTTP 请求和响应处理。#[get("/")]
fn index() -> &'static str {"Hello, world!"
}#[launch]
fn rocket() -> _ {rocket::build().mount("/", routes![index])
} 
  • #[get("/")]:这是一个 Rocket 允许的路由宏,表示它处理 HTTP GET / 请求

  • 函数 index():则是处理上述GET请求,返回 静态字符串 "Hello, world!"

  • #[launch]:Rocket 框架提供的宏,表示这个函数是 应用的启动入口

  • rocket::build()

    • Rocket 提供的 构建服务器的 API
    • 负责 创建 Web 服务器实例,类似于 HttpServer::new() 这样的服务器初始化代码。
  • .mount("/", routes![index])

    • index 这个路由挂载到 /
    • routes![index] 是一个宏,将 index 作为可解析的 HTTP 处理函数。

Rocket框架生命周期

Rocket 是一个 Web 框架,主要用于处理 HTTP 请求并返回相应的响应。整个请求处理过程可以被划分为四个主要阶段,每个阶段都承担着特定的任务,以确保请求能够被正确解析、验证、处理,并最终返回给客户端。

1. 路由解析(Routing)

当服务器收到一个 HTTP 请求时,首先需要确定这个请求应该由哪个处理器来处理。这一步的主要任务是解析 HTTP 请求的 方法和路径,并将其映射到开发者定义的路由。

处理流程:

  1. 接收客户端请求

    GET /hello HTTP/1.1
    Host: example.com
    
  2. Rocket 解析 URL 路径HTTP 方法,并尝试匹配 #[get("/hello")] 这样的路由。如果匹配到,则进入下一阶段 Validation。如果 未匹配到,则返回 404 Not Found 或进入错误处理器。

2. 参数验证(Validation)

在匹配到路由后,Rocket 会检查请求的参数、请求体和头部信息是否符合要求。这一步可以防止数据格式错误、缺少必要参数,或者提供了不符合预期类型的数据。

处理流程:

  1. 解析请求参数,例如:

    #[get("/user/<id>")]
    fn get_user(id: u32) -> String {format!("User ID: {}", id)
    }
    

    如果 id 传递的是 123,验证通过,进入 Processing 阶段。如果 id 传递的是 "abc",Rocket 会 尝试匹配下一个处理器。如果 没有匹配的处理器,进入 错误处理器。

3. 处理请求(Processing)

参数验证通过后,Rocket 会调用相应的处理器,执行开发者定义的逻辑。例如,查询数据库、计算数据、返回模板页面等操作。

流程:

  1. 处理器函数被调用:

    #[get("/hello")]
    fn hello() -> &'static str {"Hello, Rocket!"
    }
    
  2. 代码执行完成后,处理器会返回一个 Response 对象,表示请求处理的最终结果。

4. 生成响应并返回(Response)

在 Rocket 处理完请求后,服务器需要将结果封装成 HTTP 响应格式,并通过 TCP 发送给客户端。

流程:

  1. 处理器返回的数据。Rocket 将数据封装为 HTTP 响应:

    HTTP/1.1 200 OK
    Content-Type: text/plain
    Content-Length: 15Hello, Rocket!
    
  2. 响应被发送回客户端。

Rocket request

Rocket 主要支持以下 HTTP 方法:

HTTP 方法描述Rocket 语法
GET获取资源#[get("/")]
POST提交数据#[post("/")]
PUT更新资源#[put("/")]
DELETE删除资源#[delete("/")]
PATCH局部更新资源#[patch("/")]
OPTIONS询问服务器支持的方法#[options("/")]
HEAD获取响应头信息#[head("/")]

Rocket 与计算机网络的交互分析

Rocket 作为 Web 框架,本质上是 一个运行在 TCP/IP 之上的 HTTP 服务器,它负责:

  1. 监听客户端的 TCP 连接(基于 bind() 绑定 IP 和端口,使用 listen() 进入等待状态)。
  2. 解析 HTTP 请求(Rocket 解析 HTTP 方法、路径、头部、请求体等)。
  3. 匹配并调用相应的路由处理器(基于 #[get("/")] #[post("/")] 等路由规则)。
  4. 执行业务逻辑(处理数据库查询、文件操作、计算等)。
  5. 构造并返回 HTTP 响应(将响应数据通过 TCP 发送回客户端)。
  6. 管理 TCP 连接(短连接自动关闭,长连接支持 Keep-Alive)。

下面我们以上述例子重点分析 Rocket 框架 如何与计算机网络交互,即 Rocket 如何在 TCP/IP 协议栈上处理 HTTP 请求

1.监听 TCP 端口(服务器启动)

Rocket 如何监听 HTTP 端口

rocket::custom(Config::figment().merge(("port", 8080))//服务器监听 8080 端口.merge(("address", "0.0.0.0"))//监听所有网络接口,允许外部访问。
)

计算机网络层面的交互

当我们的Rocket 服务器启动时,它会监听一个 TCP 端口,例如 8080。这一过程本质上是 让操作系统创建一个 TCP 监听 socket,使得服务器可以接收来自客户端的 HTTP 请求。

socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
bind(0.0.0.0:8080)
listen()

等待客户端连接(TCP 三次握手):

  • 客户端向 http://127.0.0.1:8080/ 发送 TCP SYN 请求
  • Rocket 服务器响应 SYN-ACK 并建立 TCP 连接。
  • 客户端发送 ACK 确认,连接建立。

在这里插入图片描述

2.处理 HTTP 请求

当客户端与 Rocket 服务器 建立 TCP 连接 后,它会发送 HTTP 请求。Rocket 服务器需要解析这个 HTTP 请求,并匹配到相应的 处理函数,最终返回响应。

①客户端发送 HTTP 请求

客户端可以使用 浏览器、curl、Postman 发送请求。比如:

curl -X GET http://127.0.0.1:8080/hello

这相当于向服务器发送以下 HTTP 请求:

GET /hello HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: curl/7.68.0
Accept: */*
部分示例含义
请求行GET /hello HTTP/1.1GET 方法,请求 /hello 路径,使用 HTTP/1.1
请求头部Host: 127.0.0.1:8080服务器地址和端口
User-Agent: curl/7.68.0客户端信息(curl 版本)
Accept: */*可接受的响应类型
②Rocket 解析 HTTP 请求

Rocket 服务器使用 TCP socket 读取 HTTP 请求数据,然后解析 方法、路径、头部和请求体。Rocket 依赖 Hyper 库 来解析 HTTP。

③Rocket 如何匹配请求

在 Rocket 中,路由的匹配基于 方法+ 路径。

#[get("/hello")]
fn hello() -> &'static str {"Hello, Rocket!"
}

解析后的方法为GET,路径为/hello。接着Rocket 查找匹配的 #[get("/hello")] 路由,去执行hello()方法。

如果 /hello 路由不存在,Rocket 会返回大家熟知的 404 Not Found

如果是有参数的方法如post,能够解析路径变量返回。处理逻辑完成后,构造 HTTP 响应并发送回客户端

3.Rocket返回 HTTP 响应(服务器->客户端)

Rocket 处理完请求后,构造 HTTP 响应

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 15Hello, Rocket!

底层 Rocket 发送 TCP 数据包:

fn hello() -> &'static str {"Hello, Rocket!"
}

Rocket 服务器会通过 send() 将数据拆分为多个 TCP 数据包并发送给客户端。

4. 关闭 TCP 连接

默认情况下,Rocket 使用短连接,即 每个 HTTP 请求完成后,服务器会主动关闭 TCP 连接。关闭连接需要经过 TCP 四次挥手

在这里插入图片描述
如果使用 Keep-Alive 连接,服务器会在 HTTP 头部返回:

Connection: keep-alive

Keep-Alive 模式下,TCP 连接不会立即关闭,多个 HTTP 请求可以复用同一个 TCP 连接,提高性能。

综上,Rocket 依赖 TCP 进行可靠传输,解析 HTTP 请求,执行业务逻辑,并返回响应给客户端。

Rocket 作为 Web 框架,本质上运行在 计算机网络协议栈 之上。它负责解析 HTTP 请求、执行应用逻辑,并返回响应,而这些操作依赖于计算机网络的各个层次。

Rocket 阶段涉及的网络层主要任务
Routing物理层 -> 数据链路层 -> 网络层 -> 传输层 -> 应用层监听 TCP 端口,解析 HTTP 请求,匹配路由
Validation传输层(TCP)+ 应用层(HTTP)确保数据完整性,解析 URL、Header、Body
Processing应用层(HTTP)+ 传输层(TCP)处理业务逻辑,可能访问数据库或外部 API
Response应用层(HTTP)+ 传输层(TCP)+ 网络层(IP)生成 HTTP 响应,返回数据给客户端
文章来源:https://blog.csdn.net/m0_50499434/article/details/146176418
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/server/174941.html

相关文章

Rabbitmq--延迟消息

13.延迟消息 延迟消息&#xff1a;生产者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间之后才会收到消息 延迟任务&#xff1a;一定时间之后才会执行的任务 1.死信交换机 当一个队列中的某条消息满足下列情况之一时&#xff0c;就会…

【Docker】- Windows11 安装和配置

Windows 11 家庭版 安装Docker Docker是什么 Docker 是一个开源的容器化平台&#xff0c;它可以让你在一个独立、轻量的环境中运行应用程序。它主要由以下几个核心概念组成&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;Docker 的应用程序模板&#xff0c;包含…

提升工地安全:视觉分析助力挖掘机作业监控

在现代化施工场景中&#xff0c;挖掘机的应用极为广泛&#xff0c;但其作业半径内的安全问题一直是行业关注的重点。传统的安全监管方式往往依赖于人工巡视和物理隔离&#xff0c;但这种方式存在监控盲区大、反应速度慢等不足。随着人工智能和计算机视觉技术的快速发展&#xf…

WPF 制作机械手动画

偶然的机会想做一个双手臂运转的机械手动作动画&#xff0c;重要的是有前辈写好的可以模仿&#xff1a;WPF开发经验-实现一种三轴机械手控件 - 一团静火 - 博客园 shit&#xff0c;公司禁止上传图片了 --------------------------------------------------------------------…

C#中类‌的核心定义

‌C# 类‌是面向对象编程&#xff08;OOP&#xff09;中的核心概念之一&#xff0c;用于定义对象的模板或蓝图&#xff0c;包含数据成员&#xff08;字段、属性&#xff09;和函数成员&#xff08;方法、事件等&#xff09;。类提供了封装机制&#xff0c;将数据和操作数据的方…

c++中cout输出指定位数的int类型数据,输出指定精度的浮点型数据

1、输出指定位数的int型数据&#xff08;包含iomanip文件&#xff09; #include <iostream> #include <iomanip>int main() {int num 123;// 设置输出宽度为5&#xff0c;不足5位在前面补空格std::cout << std::setw(5) << num << std::endl;/…

Spring WebSocket 像写http接口一样处理WebSocket消息(Stomp协议)

简单的WebSocket服务搭建 在聊Stomp协议之前&#xff0c;先看一下Spring boot使用比较原始的方法是怎么搭建WebSocket服务的 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactI…

网络爬虫-1:发送请求+维持会话+代理设置/超时设置

1.基于get发送请求 2.基于post发送请求 3.维持会话 4.代理设置/超时设置 一.基于get发送请求 1.获取网页源码1 使用json库中的json.loads(),将json格式的字符串变为Python的字典形式 以下通过http://httpbin.org/get网址进行基本练习操作 import requests import json urlh…