Найти тему
Ржавый код

Создайте CRUD API с помощью rust

Оглавление

Привет. Сегодня я собираюсь показать вам, как создать очень простой REST API в Rust.

Для этого мы собираемся использовать Teo фрамеворк. Teo - это первый доминирующий веб-фреймворк для rust, подобный Ruby on Rails для Ruby и Django для Python. Эта статья будет охватывать все вещи, упомянутые ниже:

  • Запуск веб-сервера и прослушайте порта
  • Подключение к базе данных и настройка миграции
  • Обработка URL-маршрутов
  • Выполнение GRUD манипуляций
  • Создание типобезопасных клиент запросов

Установка Teo

Если у вас не установлен rust, установите его с официального сайта. Как только rust будет установлен, давайте установим инструмент командной строки Teo.

Мы устанавливаем Teo с помощью cargo, инструмента управления пакетами rust.

-2

После установки Teo введите `cargo teo --help` для подтверждения установки.

Создание проекта

Давайте создадим пустой проект с помощью `mkdir` и создадим в нем наш первый файл схемы.

-3

Задекларируем коннектор с SQL

Коннектор указывает, какой тип базы данных он использует и к какой базе данных он подключен. Один проект Teo может иметь только один коннектор. Давайте объявим это в схеме.

-4

Этот коннектор подключается к базе данных SQLite в памяти. Это отлично подходит для демонстрационных целей. Teo поддерживает также MySQL, PostgreSQL и MongoDB. В процессе производства вы можете захотеть выбрать один из них. Просто измените коннектор, и вам даже не нужно менять свои модели, если вы не используете MongoDB.

Конфигурация сервера

У Teo отличный язык схем, и внутри него все объявлено. Как и конфигурация сервера. Добавьте эти строки в конец `schema.teo`.

-5

Наш сервер будет прослушивать порт 5500.

Клиентские запросы

Иметь фронтенд-разработчика для копирования всех объектов передачи данных и интерфейсов не так уж элегантно. Поскольку эти работы настолько дублируются. Teo создает типобезопасные клиенты запросов для разработчиков интерфейсов. В этом руководстве давайте объявим клиент TypeScript.

-6

Обратите внимание на элемент host, клиент запросов будет отправлять запросы только на наш работающий сервер на порту 5500. Мы сгенерируем наш клиент запроса после объявления моделей.

Модели

Объявлять модели в Teo просто. Обработчики HTTP-маршрутов автоматически генерируются в соответствии с моделями.

-7

Мы объявили две модели: User и Post. Электронная почта пользователя уникальна. Когда задано значение электронной почты, выполняется проверка. У пользователя много записей, в то время как у записи есть пользователь. Сообщение имеет необязательный контент, опубликовано имеет значение по умолчанию false.

Генерация запросов клиента и отправка

Давайте сгенерируем клиент запроса с помощью следующей команды и запустим сервер:

-8

Перейдите в каталог сгенерированного клиента запросов и установите там ts-node.

Давайте напишем несколько скриптов для отправки запросов на наш сервер. Создайте файл с именем try.ts со следующим содержимым внутри сгенерированного каталога клиента запроса:

-9

Давайте запустим этот файл, и вы увидите следующие выходные данные:

-10
-11

Здесь мы создали пользователя с двумя постами. На стороне сервера вы увидите строку вывода, подобную этой:

-12

Этот запрос занимает 5 мс на моем Mac. Это очень быстро.

Сеанс пользователя

API не завершен, если пользователь не может войти в систему. Давайте добавим пользовательский сеанс, изменив объявление пользовательской модели следующим образом:

-13

Мы добавили декоратор `@identity` в пользовательскую модель, это делает пользовательскую модель аутентифицируемой. Также добавили этот декоратор в поле электронной почты. Это означает, что пользователи входят в систему с помощью электронной почты. Мы добавили новое поле - пароль. Это доступно только для записи, и интерфейс не сможет cчитать. Сохраняем зашифрованный пароль и проверяем пароль пользователя при входе в систему.

Давайте выключим сервер, восстановим клиент и перезапустим сервер.

-14

Теперь давайте запустим следующий скрипт:

-15

Вы получите информацию о пользователе вместе с токеном JWT, подобным этому.

-16

Защита API

Теперь у нас есть пользовательские сеансы, давайте защитим наш API с помощью guards. Средства защиты не позволяют произвольным лицам получать доступ к защищенным ресурсам API. Это делает наш API безопасным.

Замените два объявления модели следующими:

-17

Мы добавили декоратор `@canMutate` к каждой из моделей. Что касается пользователя, то любой может создать пользователя, он же зарегистрироваться. Но только сам пользователь может обновить или удалить себя. Только владелец записи может обновить или удалить запись. Создавать сообщения могут только действительные пользователи платформы.

Опять же, давайте выключим сервер, восстановим клиент и перезапустим сервер.

-18

Запустите этот скрипт, чтобы на этот раз проверить наших охранников.

-19
-20

Вы увидите результаты, подобные этому:

-21

Питер может создавать и обновлять свои посты, в то время как, если Ада попытается обновить пост Питера, клиент запроса выдает ошибку “Отказано в разрешении”. Guards делают API безопасным, и написать guards в Teo не так сложно, как в других фреймворках.

Сокращение выходные данные при нахождении многих записей

Поскольку наше приложение представляет собой систему ведения блога, при перечислении сообщений пользователя результаты будут довольно большими. Давайте сократим его с помощью элемента конвейера Teo `$when`. $if тестируешь условия и делаешь что-то условно.

-22

При нахождении одного поста ответ по-прежнему заполнен. При отображении в виде списка результатов в нем отображается не более 5 слов.

Давайте снова восстановим клиент и перезапустим сервер:

-23

Запустите этот скрипт:

-24

Вы увидите следующие выходные данные:

-25

Содержимое второго поста отображается в результатах списка, в нем отображаются только 5 слов. Когда оно только извлекается, содержимое заполнено.

Расширение с помощью объектов модели

Опыт Тео интересен. До сих пор мы на самом деле не написали ни строчки Rust. Однако язык Teo schema language не может предоставить все функции, необходимые разработчику. Teo позволяет генерировать объекты модели. Использование объектов модели аналогично использованию объекта модели в любой другой ORM.

Давайте обновим наш проект до “настоящего” проекта Rust. Запустите эту команду прямо в каталоге, где находится schema.teo.

-26

Добавьте эти две строки в раздел [dependencies] Cargo.toml.

-27

Давайте объявим блок сущности модели внутри файла схемы.

-28

Затем мы сгенерируем файлы сущностей с помощью этой команды генератора:

-29

Для простоты давайте распечатаем пользователя, когда он будет сохранен. Замените содержимое `src/main.rs` на это:

-30

Мы создали обратный вызов с именем `printUser`, давайте подключим это к схеме. Поместите этот декоратор поверх блока пользовательской модели.

-31

Так что весь пользовательский блок станет таким:

-32

Теперь вместо того, чтобы запускать `cargo teo serve`, мы запускаем `cargo run serve`. На этот раз мы создаем наш собственный исполняемый файл вместо использования CLI Teo по умолчанию. Этот исполняемый файл используется так же, как и в Teo CLI. Разница в том, что он считывает пользовательский программный код и компилирует его вместе с базовой функциональностью Teo.

Запустите этот скрипт из клиента запросов:

-33

В консоли сервера вы увидите, что этого пользователя.

-34

Статья на list-site.