@TicSo

Как в код сервера axum внести счётчик ответов на запросы клиента из браузера?

От клиента из браузера уходит ( const response = await fetch ) пакет запросов на сервер AXUM. Если количество запросов большое, то ответы приходят в иной последовательности.
Например, если хочу на сервере сделать нумерацию такого блока ответов, то как в ниже-приведенный код AXUM её внести?

axum

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// ...
let mut cnt_ajax: u32 = 0;
//
let app = Router::new()
   //
   .route("/main", get(handler))
   .nest_service("/front/ver_01", ServeDir::new(format!("{}/front", assets_path.to_str().unwrap())))
   .route("/users", post(create_user));
   //
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
// ...
}

async fn create_user(
    // this argument tells axum to parse the request body
    // as JSON into a `FromBrowser` type
    Json(payload): Json<FromBrowser>,
 ) -> (StatusCode, Json<User>) {
    // подготавливаю данные на отправку в браузер:
    let user = User {
       id: payload.id,
       username: payload.username,
       tm: payload.tm,
       cnt: cnt_ajax + 1,   // считаю отправки; 
    };                               
    // this will be converted into a JSON response
    // with a status code of `201 Created`
    (StatusCode::CREATED, Json(user))
 }

// the output to our `create_user` handler
// то, что буду отправлять с сервера раст на браузер:
#[derive(Serialize, Debug)]
struct User {
   id: u64,
   username: String,
   tm: f64,
   cnt: u32,                // считаю отправки;
}



Что делаю:
в main внес строку: let mut cnt_ajax: u32 = 0;
хочу в функции
async fn create_user
использовать эту переменную cnt_ajax
типа:
async fn create_user(Json(payload): Json, &mut cnt_ajax: u32,) -> (StatusCode, Json) {}
Не получается её туда внести.
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
bingo347
@bingo347
Crazy on performance...
https://doc.rust-lang.org/std/sync/atomic/struct.A...

use std::sync::atomic::{AtomicU32, Ordering};

async fn create_user(
    Json(payload): Json<FromBrowser>,
 ) -> (StatusCode, Json<User>) {
    static COUNTER: AtomicU32 = AtomicU32::new(0);

    // подготавливаю данные на отправку в браузер:
    let user = User {
       id: payload.id,
       username: payload.username,
       tm: payload.tm,
       cnt: COUNTER.fetch_add(1, Ordering::SeqCst),   // считаю отправки; 
    };

    (StatusCode::CREATED, Json(user))
 }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы