Введение
В этом руководстве вы узнаете, как создать веб-сервер на Rust и фреймворке Actix-web на базе сервера DigitalOcean. Вы настроите основной сервер и создадите маршруты для управления простым списком задач, поддерживающим распространённые RESTful-операции, такие как получение и создание задач.
Предпосылки
Прежде чем начать, убедитесь, что у вас есть следующее:
- Один Учетная запись облака DigitalOcean Для вращения капли.
- Ubuntu Droplet запущен и работает.
- Rust установлен на Droplet.
- Знакомство с принципами Rust, включая переменные, функции и атрибуты.
Шаг 1 — Настройка Ubuntu Droplet
SSH-подключение к вашему дроплету DigitalOcean: Откройте терминал и выполните следующую команду для SSH-подключения к вашему дроплету. Замените your_username на ваше настоящее имя пользователя, а your_droplet_ip — на IP-адрес вашего дроплета:
ssh your_username@your_droplet_ip
Обновление списка пакетов: После входа в систему обновите список пакетов, чтобы убедиться, что у вас есть самая актуальная информация о доступных пакетах:
sudo apt update
Установка Rust: Чтобы установить Rust, используйте следующую команду, которая загрузит и запустит скрипт установки Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Следуйте инструкциям на экране для завершения установки. После установки может потребоваться перезапустить терминал или выполнить:
source $HOME/.cargo/env
Установка необходимых библиотек: установите библиотеки, необходимые для сборки приложений Rust. Вы можете установить build-essential и libssl-dev с помощью:
sudo apt install build-essential libssl-dev
Проверка установки Rust: Чтобы убедиться, что Rust установлен правильно, проверьте версию:
rustc --version
Установка Cargo (менеджер пакетов Rust): Cargo устанавливается автоматически вместе с Rust. Вы можете проверить установку, проверив версию:
cargo --version
Шаг 2 — Запуск проекта
Давайте создадим новый проект Rust sammy_todos, используя полезную нагрузку
cargo new sammy_todos
Затем найдите файл Cargo.toml. Перейдите в корневой каталог вашего проекта Rust. Файл Cargo.toml находится в том же каталоге, где вы создали свой проект (например, sammy_todos). Чтобы перейти в каталог проекта, используйте следующую команду:
cd sammy_todos/
lsНиже приведены файлы проекта Rust, которые генерируются автоматически:
Output
Cargo.toml srcДобавьте actix-web и serde в качестве зависимостей в Cargo.toml. В данном случае serde требуется для сериализации и десериализации.
vi Cargo.toml
И добавьте следующие строки в зависимости.
[dependencies]
actix-web = "4.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"Теперь используйте следующую команду для загрузки и компиляции зависимостей:
cargo build
Шаг 3 — Создание базового сервера
Добавьте следующие строки кода в файл main.rs для запуска основного сервера. Перейдите в каталог src вашего проекта.
use actix_web::{get, App, HttpServer, HttpResponse, Responder,web};
#[get("/")]
async fn index() -> impl Responder {
HttpResponse::Ok().body("Welcome to the Sammy Todo API!")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(index)
})
.bind("127.0.0.1:8080")?
.run()
.await
}Запускаем сервер:
cargo run
Чтобы протестировать сервер, откройте новый сеанс терминала и выполните следующую команду:
curl http://127.0.0.1:8080
Вы должны получить следующий ответ:
Output
Welcome to the Sammy Todo API!Шаг 4 — Добавьте модель Todo
Модель Todo необходима для сериализации запроса и ответа. Добавьте следующие строки кода в файл main.rs.
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct Todo {
id: i32,
title: String,
completed: bool,
}Шаг 5 — Реализация. Создание задачи.
Этот API создает задачу, и это фиктивный API, который просто возвращает вашу задачу, но вы можете реализовать его с помощью баз данных, чтобы сделать его постоянным.
#[get("/todos")]
async fn create_todo(todo: web::Json<Todo>) -> impl Responder {
HttpResponse::Ok().body(serde_json::to_string(&todo).unwrap())
}
Шаг 6 — Запустить Get todo
Этот API возвращает задачу с идентификатором:
#[get("/todos/{id}")]
async fn get_todo(id: web::Path<i32>) -> impl Responder {
let todo = Todo {
id: id.into_inner(),
title: "Learn Actix-Web".to_string(),
completed: false,
};
HttpResponse::Ok().body(serde_json::to_string(&todo).unwrap())
}Подключите услугу к вашему серверу
Файл main.rs сервера Rust выглядит так:
use actix_web::{get, App, HttpServer, HttpResponse, Responder, web};
#[get("/")]
async fn index() -> impl Responder {
HttpResponse::Ok().body("Welcome to the Sammy Todo API!")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(index)
.service(get_todo)
.service(create_todo)
})
.bind("127.0.0.1:8080")?
.run()
.await
}
use serde::{Serialize, Deserialize}; // Added Deserialize to imports
#[derive(Serialize, Deserialize)] // Ensure Deserialize is imported
struct Todo {
id: i32,
title: String,
completed: bool,
}
#[get("/todos")]
async fn create_todo(todo: web::Json<Todo>) -> impl Responder {
HttpResponse::Ok().body(serde_json::to_string(&todo).unwrap())
}
#[get("/todos/{id}")]
async fn get_todo(id: web::Path<i32>) -> impl Responder {
let todo = Todo {
id: id.into_inner(),
title: "Learn Actix-Web".to_string(),
completed: false,
};
HttpResponse::Ok().body(serde_json::to_string(&todo).unwrap())
}Теперь вы можете проверить это, отправив POST-запрос с помощью curl:
curl -X POST -H "Content-Type: application/json" -d '{"title": "Buy groceries"}' http://127.0.0.1:8080/todos
Результат
Поздравляем! Вы успешно настроили базовый веб-сервер с использованием Rust и Actix. В этом руководстве вы научитесь создавать конечные точки для получения и создания элементов Todo, что заложит прочную основу для создания более сложных приложений. Для дальнейшего усовершенствования вашего приложения интегрируйте решение для хранения данных на основе базы данных, которое позволит вам эффективно хранить и управлять элементами Todo.









