Server-side Web

11 януари 2022

Административни неща

За боба, 'леба и уеба

За боба, 'леба и уеба

За боба, 'леба и уеба

Накратко как работи Интернета:

За боба, 'леба и уеба

Накратко как работи Интернета:

За боба, 'леба и уеба

Накратко как работи Интернета:

За боба, 'леба и уеба

Накратко как работи Интернета:

За боба, 'леба и уеба

Накратко как работи Интернета:

За боба, 'леба и уеба

Накратко как работи Интернета:

За боба, 'леба и уеба

Накратко как работи Интернета:

За боба, 'леба и уеба

Сървъра е просто един цикъл, който чака низова информация в определен формат и връща низова информация в определен формат. Може да го напишем на shellscript, ако искаме (но ще го пишем на Rust).

Разбира се, в реални условия е доста по-сложно да се докарат всички детайли.

(Тия обяснения вероятно не са достатъчни за начинаещ, но поне не са нищо. ¯\_(ツ)_/¯)

Hello Web

Demo

https://github.com/AndrewRadev/hello-rusty-web

Hello Web

Demo

Версии:

1 2 3
[dependencies]
actix-rt = "1.1.1"
actix-web = "3.3.3"

Има бета версия на actix-web 4, която не ползва actix-rt а директно tokio. Из документацията (и из качествената книжка zero2prod) може да намерите употреба на tokio::main и tokio::test вместо actix_rt::main и actix_rt::test.

Hello Web

Demo

Hello Web

Demo

Hello Web

Demo

Hello Web

Demo

Hello Web

Demo

Actix-web

Extractor magic: https://github.com/actix/actix-web/blob/0a506bf2e9f0d07c505df725a68808c6343f7a4e/src/handler.rs#L179-L206

Spotiferris

Ще разгледаме (началото на) малък проект за хостинг на музика. Stack-а:

Source: https://github.com/AndrewRadev/rust-spotiferris

Стара версия с gotham + diesel: https://github.com/AndrewRadev/rust-spotiferris/releases/tag/gotham-diesel-askama

Database

1
cargo install sqlx-cli --no-default-features --features rustls,postgres

Бележка: sqlx като библиотека в dependencies е версия 0.4.2, докато command-line tool-a използва 0.5.x. This is fine.

Gotchas

1 2
match form.insert(&db) {
    Ok(id) => {

Грешка:

1 2 3 4 5 6 7 8 9 10 11 12 13
error[E0308]: mismatched types
  --> src/handlers.rs:86:13
   |
86 |             Ok(id) => {
   |             ^^^^^^ expected opaque type, found enum `std::result::Result`
   |
  ::: src/models.rs:40:48
   |
40 |     pub async fn insert(&self, db: &PgPool) -> Result<i32, sqlx::Error> {
   |                                                ------------------------ the `Output` of this `async fn`'s expected opaque type
   |
   = note: expected opaque type `impl futures::Future`
                     found enum `std::result::Result<_, _>`

Gotchas

1 2
match form.insert(&db).await {
    Ok(id) => {

All good!

Auto-reload

1 2
cargo install cargo-watch
cargo watch -x 'run --bin server'

Testing

:/

1
cargo test -- --test-threads=1

Luca Palmieri има друго валидно решение -- база данни с ново име за всеки индивидуален тест. Вариант е.

Също е вариант да пробвате този crate: https://crates.io/crates/serial_test

Spotiferris

Проблеми

Spotiferris

Проблеми

Spotiferris

Проблеми

Spotiferris

Проблеми

Spotiferris

Проблеми

Ресурси

Ресурси

Ресурси

Ресурси

Проекти?

Проекти?

Проекти?

Проекти?

Проекти?

Проекти?

Въпроси