Server-side Web

18 януари 2021

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Hello Web

Demo

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

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 postgres

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 има друго валидно решение -- база данни с ново име за всеки индивидуален тест. Вариант е.

Spotiferris

Проблеми

Spotiferris

Проблеми

Spotiferris

Проблеми

Spotiferris

Проблеми

Spotiferris

Проблеми

Ресурси

Ресурси

Ресурси

Ресурси

Проекти?

Проекти?

Проекти?

Проекти?

Проекти?

Въпроси