RocketRust Web框架入门教程

Rust Rocket 框架使用方法 摘要:Rust Rocket 基本使用框架 Rocket CMS详细讲解 、Rocket框架中的图书管理系统 GIS管理系统概要、编写Android后台服务平台详细、Rocket Vue3构建基础管理系统、研究与HarmonyOS管理系统。 阅读详情

引言

想开发高性能、安全可靠的Web应用?Rust语言的生态系统中,Rocket框架无疑是最引人注目的选择之一!作为一个专注于简洁性、安全性和速度的Web框架,Rocket让Rust开发者能够快速构建稳健的Web应用,而不必被复杂的底层细节困扰。

在这篇教程中,我将带你踏上Rocket开发之旅,从零开始搭建你的第一个Rust Web应用。不需要高深的Rust知识,只要有基础的编程经验就足够了!(当然,了解一些Rust会更好!)

为什么选择Rocket?

在深入代码之前,先来聊聊为什么要考虑Rocket:

  1. 安全至上 - 充分利用Rust的内存安全保证
  2. 表达力强 - 简洁优雅的API设计
  3. 类型驱动 - 利用Rust强大的类型系统,在编译时捕获错误
  4. 性能出色 - 与Rust语言一样,追求高性能
  5. 零成本抽象 - 提供直观API的同时不牺牲性能

最近Rocket已经发布了稳定的1.0版本,彻底摆脱了只能在Rust nightly频道运行的限制。这意味着你可以在生产环境中更加自信地使用它!

环境准备

开始前,确保你的开发环境已准备就绪:

  1. 安装Rust - 如果还没有安装,运行:

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    
  2. 创建新项目 - 用Cargo创建项目:

    cargo new rocket_demo
    cd rocket_demo
    
  3. 添加依赖 - 编辑Cargo.toml文件,添加Rocket依赖:

    [dependencies]
    rocket = "0.5.0"
    

搞定这些,我们就可以开始编码了!

你好,Rocket!

让我们从最简单的例子开始 - 一个返回"Hello, world!"的Web服务器。

打开src/main.rs并替换为以下代码:

#[macro_use] extern crate rocket;

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

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![index])
}

看起来很简单,对吧?让我解释一下这段代码:

  1. #[macro_use] extern crate rocket; - 导入Rocket宏
  2. #[get("/")] - 路由注解,表示这个函数处理根路径的GET请求
  3. index() - 处理请求的函数
  4. #[launch] - 告诉Rocket这是应用入口点
  5. rocket::build().mount() - 创建Rocket实例并挂载路由

现在,运行这个程序:

cargo run

如果一切顺利,你应该看到Rocket启动信息,表明服务器正在监听(默认是localhost:8000)。打开浏览器访问 http://localhost:8000,瞧!你的第一个Rocket应用正在运行!(是不是很简单?!)

路由进阶

Web框架的核心是路由系统,Rocket在这方面做得相当出色。让我们扩展应用,添加更多路由:

#[macro_use] extern crate rocket;

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

#[get("/hello/<name>")]
fn hello(name: &str) -> String {
    format!("Hello, {}!", name)
}

#[get("/about")]
fn about() -> &'static str {
    "This is a demo Rocket application."
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![index, hello, about])
}

注意/hello/<name>路径中的<name>参数。Rocket会自动将URL中的这部分提取为name参数传给函数。这种直观的URL参数处理是Rocket的一大特色!

现在你可以访问:

  • http://localhost:8000/ - 显示欢迎信息
  • http://localhost:8000/hello/Rustacean - 显示"Hello, Rustacean!"
  • http://localhost:8000/about - 显示关于信息

处理不同的HTTP方法

在实际应用中,我们需要处理不同的HTTP方法(GET、POST等)。Rocket让这变得简单:

#[macro_use] extern crate rocket;
use rocket::form::Form;
use rocket::response::content::RawHtml;

#[derive(FromForm)]
struct Task {
    description: String,
    completed: bool,
}

#[get("/")]
fn index() -> RawHtml<&'static str> {
    RawHtml(r#"
        <html>
            <head><title>Task Manager</title></head>
            <body>
                <h1>Add a Task</h1>
                <form action="/task" method="post">
                    <input type="text" name="description" placeholder="Task description">
                    <input type="checkbox" name="completed"> Completed
                    <button type="submit">Add Task</button>
                </form>
            </body>
        </html>
    "#)
}

#[post("/task", data = "<task_form>")]
fn new_task(task_form: Form<Task>) -> String {
    let task = task_form.into_inner();
    format!("Added task: {} (completed: {})",
            task.description, task.completed)
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![index, new_task])
}

这个例子展示了:

  1. 使用#[post]处理POST请求
  2. 通过Form<Task>自动解析表单数据
  3. 返回HTML内容

这种类型安全的表单处理是Rocket的一大亮点 - 不再需要手动解析表单数据!

返回JSON

现代Web应用经常需要处理JSON数据。让我们看看在Rocket中如何轻松实现:

首先,更新Cargo.toml添加serde支持:

[dependencies]
rocket = { version = "0.5.0", features = ["json"] }
serde = { version = "1.0", features = ["derive"] }

然后,创建一个返回JSON的API:

#[macro_use] extern crate rocket;
use rocket::serde::{Serialize, Deserialize, json::Json};

#[derive(Serialize, Deserialize)]
struct User {
    id: u64,
    name: String,
    email: String,
    active: bool,
}

#[get("/users")]
fn get_users() -> Json<Vec<User>> {
    Json(vec![
        User { 
            id: 1, 
            name: "Alice".into(), 
            email: "alice@example.com".into(), 
            active: true 
        },
        User { 
            id: 2, 
            name: "Bob".into(), 
            email: "bob@example.com".into(), 
            active: false 
        },
    ])
}

#[post("/users", format = "json", data = "<user>")]
fn create_user(user: Json<User>) -> Json<User> {
    // 在实际应用中,这里会将用户保存到数据库
    // 这里只是简单地返回接收到的用户数据
    user
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/api", routes![get_users, create_user])
}

这个例子展示了:

  1. 使用Json<T>类型自动序列化/反序列化JSON
  2. 设置路由的format限制(只接受JSON请求)
  3. 将API路由挂载到/api前缀下

测试这个API你可以使用curl或Postman:

curl http://localhost:8000/api/users

错误处理

错误处理是任何应用的关键部分。Rocket提供了优雅的错误处理机制:

#[macro_use] extern crate rocket;
use rocket::http::Status;
use rocket::request::{self, FromRequest, Outcome};
use rocket::serde::{Serialize, json::Json};
use rocket::Request;

#[derive(Debug)]
enum ApiError {
    MissingToken,
    InvalidToken,
}

#[derive(Debug)]
struct ApiKey(String);

#[rocket::async_trait]
impl<'r> FromRequest<'r> for ApiKey {
    type Error = ApiError;

    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
        // 获取Authorization头
        let token = request.headers().get_one("Authorization");
        match token {
            Some(token) if token.starts_with("Bearer ") => {
                let key = token[7..].to_string();
                // 检查是否是有效的API密钥(这里简化处理)
                if key == "valid-api-key" {
                    Outcome::Success(ApiKey(key))
                } else {
                    Outcome::Failure((Status::Unauthorized, ApiError::InvalidToken))
                }
            }
            _ => Outcome::Failure((Status::Unauthorized, ApiError::MissingToken))
        }
    }
}

#[derive(Serialize)]
struct SecretData {
    message: String,
}

#[get("/protected")]
fn protected_route(api_key: ApiKey) -> Json<SecretData> {
    Json(SecretData {
        message: format!("You accessed protected data with key: {:?}", api_key),
    })
}

#[catch(401)]
fn unauthorized() -> &'static str {
    "Unauthorized: Invalid or missing API key"
}

#[catch(404)]
fn not_found() -> &'static str {
    "Resource not found!"
}

#[launch]
fn rocket() -> _ {
    rocket::build()
        .mount("/api", routes![protected_route])
        .register("/", catchers![unauthorized, not_found])
}

这个例子展示了:

  1. 自定义请求守卫(ApiKey)验证API密钥
  2. 使用#[catch]注解处理特定HTTP错误
  3. 用register()注册错误处理器

Rocket的请求守卫(Request Guards)机制非常强大,可以用于身份验证、授权、内容验证等各种场景。

状态管理

在Web应用中,我们经常需要共享应用状态(如数据库连接)。Rocket提供了管理状态的简洁方法:

#[macro_use] extern crate rocket;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Mutex;
use rocket::State;
use std::collections::HashMap;

// 简单计数器
struct HitCounter {
    count: AtomicUsize
}

// 模拟数据库
struct Database {
    users: Mutex<HashMap<usize, String>>
}

#[get("/")]
fn index(hit_counter: &State<HitCounter>) -> String {
    let count = hit_counter.count.fetch_add(1, Ordering::Relaxed) + 1;
    format!("This page has been viewed {} times!", count)
}

#[get("/users")]
fn list_users(db: &State<Database>) -> String {
    let users = db.users.lock().unwrap();
    let mut result = String::from("Users:\n");
    
    for (id, name) in users.iter() {
        result.push_str(&format!("ID: {}, Name: {}\n", id, name));
    }
    
    result
}

#[launch]
fn rocket() -> _ {
    // 初始化应用状态
    let hit_counter = HitCounter {
        count: AtomicUsize::new(0)
    };
    
    let mut initial_users = HashMap::new();
    initial_users.insert(1, "Alice".to_string());
    initial_users.insert(2, "Bob".to_string());
    
    let database = Database {
        users: Mutex::new(initial_users)
    };
    
    rocket::build()
        .mount("/", routes![index, list_users])
        .manage(hit_counter)  // 添加状态
        .manage(database)     // 添加数据库
}

这个例子说明:

  1. 使用State<T>访问应用状态
  2. 通过.manage()方法注册状态
  3. 使用Mutex和AtomicUsize安全地共享状态

在实际应用中,你可能会使用这种方式管理数据库连接池、缓存、配置等。

结合数据库

让我们看一个与SQLite数据库集成的更实际的例子。首先,更新Cargo.toml:

[dependencies]
rocket = { version = "0.5.0", features = ["json"] }
serde = { version = "1.0", features = ["derive"] }
rusqlite = "0.28.0"

然后,实现一个简单的待办事项应用:

#[macro_use] extern crate rocket;
use rocket::serde::{Serialize, Deserialize, json::Json};
use rocket::State;
use rusqlite::{Connection, Result as SqlResult, params};
use std::sync::Mutex;

struct AppDatabase {
    conn: Mutex<Connection>,
}

#[derive(Debug, Serialize, Deserialize)]
struct Todo {
    id: Option<i64>,
    title: String,
    completed: bool,
}

// 初始化数据库
fn init_db() -> SqlResult<Connection> {
    let conn = Connection::open("todos.db")?;
    
    conn.execute(
        "CREATE TABLE IF NOT EXISTS todos (
            id INTEGER PRIMARY KEY,
            title TEXT NOT NULL,
            completed BOOLEAN NOT NULL DEFAULT 0
        )",
        [],
    )?;
    
    Ok(conn)
}

#[get("/todos")]
fn get_todos(db: &State<AppDatabase>) -> Json<Vec<Todo>> {
    let conn = db.conn.lock().unwrap();
    let mut stmt = conn.prepare("SELECT id, title, completed FROM todos").unwrap();
    
    let todos = stmt.query_map([], |row| {
        Ok(Todo {
            id: Some(row.get(0)?),
            title: row.get(1)?,
            completed: row.get(2)?,
        })
    })
    .unwrap()
    .map(|result| result.unwrap())
    .collect();
    
    Json(todos)
}

#[post("/todos", format = "json", data = "<todo>")]
fn create_todo(todo: Json<Todo>, db: &State<AppDatabase>) -> Json<Todo> {
    let mut todo = todo.into_inner();
    let conn = db.conn.lock().unwrap();
    
    let result = conn.execute(
        "INSERT INTO todos (title, completed) VALUES (?1, ?2)",
        params![todo.title, todo.completed],
    ).unwrap();
    
    if result > 0 {
        let id = conn.last_insert_rowid();
        todo.id = Some(id);
    }
    
    Json(todo)
}

#[launch]
fn rocket() -> _ {
    // 初始化数据库
    let conn = init_db().unwrap();
    let db = AppDatabase {
        conn: Mutex::new(conn),
    };
    
    rocket::build()
        .mount("/api", routes![get_todos, create_todo])
        .manage(db)
}

这个例子展示了:

  1. 使用rusqlite连接SQLite数据库
  2. 通过Mutex安全地共享数据库连接
  3. 实现基本的CRUD操作

注意:这只是一个简化示例。在生产环境中,你可能需要使用连接池和更健壮的错误处理。

静态文件和模板

最后,让我们看看如何处理静态文件和使用模板。先更新Cargo.toml:

[dependencies]
rocket = "0.5.0"
rocket_dyn_templates = { version = "0.1.0", features = ["handlebars"] }

创建项目结构:

/
├── src/
│   └── main.rs
├── templates/
│   └── index.html.hbs
└── static/
    ├── css/
    │   └── style.css
    └── js/
        └── script.js

在templates/index.html.hbs中:

<!DOCTYPE html>
<html>
<head>
    <title>{{title}}</title>
    <link rel="stylesheet" href="/static/css/style.css">
</head>
<body>
    <h1>{{title}}</h1>
    <p>{{message}}</p>
    
    <script src="/static/js/script.js"></script>
</body>
</html>

在static/css/style.css中:

body {
    font-family: Arial, sans-serif;
    margin: 40px;
    line-height: 1.6;
}

h1 {
    color: #333;
}

在static/js/script.js中:

console.log("Hello from Rocket!");

最后,在src/main.rs中:

#[macro_use] extern crate rocket;
use rocket_dyn_templates::{Template, context};
use rocket::fs::{FileServer, relative};

#[get("/")]
fn index() -> Template {
    Template::render("index", context! {
        title: "Welcome to Rocket",
        message: "A powerful web framework for Rust",
    })
}

#[launch]
fn rocket() -> _ {
    rocket::build()
        .mount("/", routes![index])
        .mount("/static", FileServer::from(relative!("static")))
        .attach(Template::fairing())
}

这个例子展示了:

  1. 使用rocket_dyn_templates渲染Handlebars模板
  2. 使用FileServer提供静态文件
  3. 使用Template::fairing()注册模板引擎

运行应用后,访问http://localhost:8000/应该会看到一个使用模板渲染的页面,带有样式和JavaScript。

总结

通过这篇教程,我们探索了Rocket框架的核心功能:

  1. 基本路由和请求处理
  2. 不同HTTP方法的处理
  3. 表单和JSON数据处理
  4. 错误处理和请求守卫
  5. 应用状态管理
  6. 数据库集成
  7. 静态文件和模板渲染

Rocket为Rust开发者提供了一个富有表现力且类型安全的Web框架,使构建高性能Web应用变得愉快。它的设计哲学"配置尽量少,表现力尽量强"使其成为Rust Web开发的绝佳选择。

还有许多我们没有涉及的高级主题,比如WebSocket支持、异步请求处理、测试等。但有了这个基础,你应该能够开始构建自己的Rocket应用,并根据需要深入探索更多功能!

记住,Rust和Rocket的组合不仅仅是关于性能和安全性,还关乎开发体验。享受编写既安全又高效的Web代码的乐趣吧!

希望这篇教程对你有所帮助!开始用Rocket构建你的下一个Web项目吧!

整理并记录几种运算放大器 运算放大器是一种十分常见的电子元器件,最近我在学习运放,以前在学校没有好好的学习,今天在B站看了唐老师讲运算放大器-唐老师讲电赛系列视频教程,记录下所学的,纯当是自己的笔记 学习运放,有两个重要的概念及重要的计算法宝,虚短vp=vn;和虚断ip=in 1反向比例运算电路 Rf可以大于、小于或等于R,起到放大、跟随、衰减输入的作用; 平衡电阻没有太高的精度要求,可加可不加; 有些运放内部集成了补偿电路,就不需要使用平衡电阻,加了反而增大误差,如OPA227 2.同向比例运放电路 . 阅读详情

相关推荐

有限时间 vs 固定时间 vs 预定时间滑模:稳定性分析与仿真验证方法对比(中)

有限时间滑模控制(FTSMC)和固定时间滑模控制(FixTSMC)是两种重要的控制策略,旨在实现系统状态的快速收敛。FTSMC通过设计滑模面和控制律,确保系统状态在有限时间内收敛到原点,但其收敛时间与初始状态相关。FixTSMC则进一步优化,使收敛时间与初始状态无关,适用于高动态环境,具有更强的鲁棒性和更平滑的控制信号。两种方法均通过李雅普诺夫函数证明其稳定性,并通过仿真验证其有效性。FixTSMC在工程应用中更为可靠,尤其适合安全关键系统。

Lyajpunov的博客 3223

Rust - Rocket框架 -基础入门

Roket官网 官方是english文档,看的很累~ 新建项目 cargo new 项目名 --bin Cargo.toml [dependencies] rocket = "0.5.0-rc.1" Hello,world! src/main.rs #[macro_use] extern crate rocket; #[get("/")] // 路由属性 fn index() -> &'static str {//请求处理程序 "Hello, world!" } #[lau

无生 的博客 5676

桁架 拓扑优化 matlab程序_拓扑优化在结构轻量化及板壳加筋肋最优布置的应用...

1 拓扑优化简介材料的有效利用一直都是人类追求的目标,也是许多研究领域不变的话题,并伴随着结构优化理论和方法的产生而发展。结构优化设计通常分为三个层次:(1)拓扑优化:在一个确定的连续区域内寻求结构内部非实体区域位置和数量的最佳配置,寻求结构中的构件布局及节点联结方式最优化,使结构能在满足应力、位移等约束条件下,将外载荷传递到结构支撑位置,同时使结构的某种性态指标达到最优;(2)形状优化:指在保持...

weixin_39525355的博客 1876

Rocket Rust Web框架入门教程

Rocket框架是Rust生态中易用性极高的Web开发工具,特别适合想快速上手Rust Web开发的开发者。它提供极简API设计、强大的类型安全支持和丰富的请求验证机制,让开发者能专注于业务逻辑而非框架复杂性。本文从零开始介绍Rocket的使用:从创建项目、定义路由到处理JSON数据、表单提交和静态文件服务,展示了Rocket直观的开发体验。通过简单的代码示例,读者可以快速掌握Rocket的核心功能,包括路由定义、请求守卫、响应类型处理等关键特性。Rocket让Rust Web开发变得简单高效,是构建安全可

2501_93502216的博客 1108

波束形成算法:LCMV实现(MATLAB)

阵列信号处理,波束成形,

weixin_43601588的博客 1万+

从零到英雄:Spring Boot 微服务架构全攻略

在数字化转型的时代,微服务架构已成为构建可扩展、高可用系统的首选方案。本文以“从零到英雄”为主题,详细指导读者使用Spring Boot快速构建微服务帝国。从基础环境搭建入手,逐步深入到服务发现、配置管理、负载均衡、断路器、API网关、安全认证、监控与部署等核心模块。通过大量代码示例和详细解释,包括中文注释,帮助初学者和中级开发者掌握Spring Boot的核心概念和技术实践。文章强调实际操作,涵盖RESTful API开发、数据库集成、容器化部署等内容,并讨论常见问题与优化策略。无论你是Java开发者还是

一个被知识诅咒的人 2697

Rust Rocket简单入门

Rust中最知名的两个web框架要数和了,Rocket更注重易用性,Actix则更注重性能。这里只是了解一下Rust下的WebAPI开发流程,就学一下最简单的 Rocket。

kfashfasf的博客 1564

Windows Server 搭建ftp服务

Windows Server 搭建ftp服务

ch258563的博客 1010

Rocket: 从零开始构建Rust Web服务

作为一个现代化的Web框架,Rocket以其类型安全性、简洁的API和卓越的性能脱颖而出。无论你是想构建一个简单的静态网站,还是复杂的RESTful API,Rocket都能胜任。通过构建一个简单的用户管理API,我们体验了Rocket的路由、数据处理、中间件以及数据库集成。现在,让我们综合这些知识,构建一个简单的用户管理API,实现用户的创建和查询功能。中间件记录了每个请求的处理时间,并将其作为HTTP响应头的一部分返回给客户端,使得开发者可以轻松监控和优化应用的性能。

hello.reader 2972

招财牛猫|股社区|猫笔刀公众号历史文章13-21年(含评论),投资内容 收藏学习

招财大牛猫|股社区|猫笔刀公主号历史文章13-21年(含评论)

ZhaoCaiDaNiuMao的博客 7231

【项目实战】AES实施应符合NIST密码算法验证程序

AES由美国国家标准与技术研究院(NIST)制定。NIST是负责开发和维护美国政府使用的技术标准的机构,包括加密标准。

奶爸的编程之路,也就一周冷个三天 765

Rocket 开源项目教程

Rocket 开源项目教程 项目介绍 Rocket 是一个用 Rust 语言编写的 2D 游戏引擎,特别适合开发类似经典游戏《火箭车》(Rocket League)的游戏。该项目旨在提供一个简单易用的框架,让开发者能够快速创建和部署 2D 游戏。Rocket 利用了 Rust 的高性能和安全性特性,确保游戏运行流畅且稳定。 项目快速启动 环境准备 在开始之前,请确保您的开发环境已经安装了 Rust...

gitblog_01094的博客 608

80、编程学习资源与x86知识全解析

本文详细介绍了编程学习中多个领域的优秀书籍和博客资源,涵盖逆向工程、C/C++、x86/x86-64架构、ARM、汇编语言、Java、UNIX、密码学等多个方向。同时,深入解析了x86架构的核心知识,包括术语、通用寄存器、FPU寄存器、SIMD寄存器、调试寄存器以及常用指令的使用方法和操作步骤。通过本文,读者可以系统地掌握底层编程知识,并应用于逆向工程、系统开发和性能优化等领域。

tree的博客 219

rust-rocket web框架 创建rocket项目

让我们创建并运行我们的第一个 Rocket 应用程序。我们将确保安装了兼容的 Rust 工具链,创建一个依赖于 Rocket 的新 Cargo 项目,然后运行该应用程序。

刘联其的个人分享 1270

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Rust日报】2020-07-13 Rust 游戏开发教程

Rust 游戏开发教程#rust@oliviff完成了她的《Rust游戏开发》的书,通过一个推箱子游戏的教程介绍Rust和游戏开发的一些概念。https://sokoban.iolivi...

Rust语言学习交流 1770

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

RUST开服教程、常用指令及心得

【前言】 【开始前你需要了解的事情】 ①常用网址 ②更新与删档日期 ③目前国服环境 【服务器硬件的选择】 【标准服务器】 ①下载和更新服务器 ②制作服务器的启动脚本 ③选择你的服务器地图 ④运行服务器 【模组服务器】 ①完成标准服务器的下载和设置 ②安装Oxide插件平台 ③下载插件 ④安装插件 ⑤调试插件 ⑥模组服的更新 ⑦在标准服中使用插件功能 【在自己的电脑上运行服务端】 ①...

diaolingtyp的博客 22万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Rust - Rocket 和 Vue 简单实现分片上传

第一次写分片上传,记录一下~ 刚学Rust没多久,代码有点乱,勉强可以浅看一看 还没实现 续传,未来可能更新这篇文章 首先 确定临时文件目录 fn 分片_root_path<P: AsRef<Path>>( path: P)-> PathBuf { Path::new("./public/分片").join(path) } 确定trait(接口) pub trait 分片 { /** #推入一个分片 */ fn push_data(&self,piec

无生 的博客 1218

jeesit框架如何使用_入门学习rocket,如何安装使用rocket,rocket是rust的一个web 框架...

入门学习rocket,如何安装使用rocketrocket 是一个web 框架安装rocket在Cargo.toml文件里面的最后一行添加rocket="0.4.4"然后cargo run运行时候可能碰到的问题和对应解决办法:1,提示rust版本不行,无法安装rocket相关联的包这个时候要下载新的rust可以使用rustup来下载新版本来解决。rustup的使用方法参考我前面的文章。2,rust...

weixin_39640845的博客 445

【Rust每周一库】Rocket - 流行的网络开发框架

简介Rocket是一个基于Rust编写的上层网络框架,是目前rust主流的网络框架之一,有8.8k的star。而它的http部分就是基于之前提到的hyper。按官方说法,具有如下三个特点...

Rust语言学习交流 4205

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 338

2026小红书小工具怎么制作:纯前端 ZIP 打包、沙箱限制与笔记挂载流程

小红书小工具制作的核心不是复杂开发,而是把需求压缩成纯前端轻交互,并按平台要求完成 ZIP 交付。适合做的方向是测试、计算器、生成器、学习小测和记录工具;不适合做的方向是账号体系、云端数据、支付和远程接口。制作时先确认沙箱限制,再整理输入、计算、输出链路,最后通过 Builder Hub 提交审核并挂载笔记。在需求简单、素材较少的情况下,十几分钟做出一个可用的小工具是现实路径,袋马就是一个选择。

qq_39308835的博客 255

Spring AI 多模态实战(下):文生图 + TTS 语音合成(含 2.0 流式音频分片)

本文基于 Spring AI 2.0.1,实战文生图与TTS语音合成:通过ImageModel/ImagePrompt生成图片(返回URL或base64),用SpeechModel/SpeechPrompt实现文字转语音;重点介绍2.0流式音频分片技术,支持低延迟长文本播报;结合缓存、落盘、限流等策略控制生成成本,避免URL过期、音频格式错乱等常见坑点。附完整代码与踩坑指南,助力构建高效多模态应用。

weixin_43128865的博客 264

Agent 的 ReAct、Plan、Execute、Reflection 模式

本文系统解析 Agent 的 ReAct、Plan、Execute、Reflection 四模式,揭示其核心为“下一步谁定”与“错了怎么发现”两大问题。ReAct 逐步决策,适合动态环境但易冗余;Plan 一次性规划,高效却惧变化;Execute 严格落地,需明确判据与失败策略;Reflection 事后校验,强化纠错闭环。四者协同:外层规划,执行中嵌入思考,每步后反思,连续失败才重规划,构建稳定可控的智能体工作流。

2401_89855466的博客 317

信号链电路怎么选运放?奥特四款信号链运放解析【选型参考】

在模拟电路设计中,运放作为信号链的“第一道门槛”,其微小误差往往决定了整个系统的成败。

naNa_1120的博客 189

流式输出 SSE:实现 AI 对话打字机效果后端开发

摘要解决传统 HTTP 请求在 LLM 长文本生成时导致的客户端长时间阻塞与 TTFT 极高的问题。适用于需为 AI 应用提供打字机效果、优化交互体验的后端开发工程师。读完可获得基于 FastAPI 与 SSE(Server-Sent Events)技术的流式响应实现代码、协议规范及生产环境避坑指南。关键词SSE、流式输出、FastAPI、打字机效果、TTFT、大模型推理背景与问题大模型(LLM)生成完整回复通常耗时数秒至数十秒,传统请求-响应模型导致用户界面长时间无响应,体验极差。

2402_85729970的博客 175

Vue-Router

本文详解前端路由原理与实现,以网易云音乐为例,介绍通过 vue-router 实现页面无刷新切换。核心步骤包括:安装模块、创建路由实例、注册应用、配置页面组件与路由出口。使用 router-link 实现声明式导航,结合 query 和 params 传参,支持模糊与精确匹配激活状态。强调 useRoute(读取参数)与 useRouter(执行跳转)的区别,帮助开发者掌握单页应用路由的核心机制。

2301_79245606的博客 333
上一篇: Apache Airflow 揭秘:用代码编排你的任务流水线!(告别脚本地狱)
下一篇: 开源库入门教程 LogrusGo结构化日志库
普通网友
博客等级 码龄1年 17粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值