@TicSo

Как обработать в axum ajax запрос от клиента?

Для web-сервера на базе axum
`_ https://github.com/tokio-rs/axum/tree/v0.6.x`

под такую файловую структуру
axum --|                        |-- file.html
            |-- front -- v01 --|-- file.css
            |                        |-- file.js
            |-- src -- main.rs
тестирую код:

main.rs

use axum::{
    routing::{get, post},
    http::StatusCode,
    response::IntoResponse,
    response::Html,
    Json, Router,
};
use serde::{Deserialize, Serialize};
use std::net::SocketAddr;
use tower_http::services::ServeDir;

#[tokio::main]
async fn main() {
    // initialize tracing
    tracing_subscriber::fmt::init();
    // build our application with a route
    let assets_path = std::env::current_dir().unwrap();
    let app = Router::new()
        .route("/info", get(html))     // http://127.0.0.1:3000/info
        .nest_service("/front/v01", ServeDir::new(format!("{}/front/v01", assets_path.to_str().unwrap())))
        .route("/info", post(create_user));
    
    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    tracing::debug!("listening on {}", addr);
    axum::Server::bind(&addr).serve(app.into_make_service()).await.unwrap();
}



// `Html` gives a content-type of `text/html`
async fn html() -> Html<&'static str> {
         include_str!("../front/v01/file.html").into()
}

async fn create_user(
    // this argument tells axum to parse the request body
    // as JSON into a `CreateUser` type
    Json(payload): Json<CreateUser>,
) -> (StatusCode, Json<User>) {
    // insert your application logic here
    let user = User {
        id: 1337,
        username: payload.username,
    };

    // this will be converted into a JSON response
    // with a status code of `201 Created`
    (StatusCode::CREATED, Json(user))
}


// the input to our `create_user` handler
#[derive(Deserialize)]
struct CreateUser {
    username: String,
}

// the output to our `create_user` handler
#[derive(Serialize)]
struct User {
    id: u64,
    username: String,
}


Получается загрузить в браузер по `_ 127.0.0.1:3000/info`
статику из папки v01. Как изменить код main.rs, чтобы работали запросы от клиента из браузера по ajax?
Например, в коде .js получил такой результат:

file.js

var serv = "http://127.0.0.1:3000/info";
...

function fun_ajx(serv, b) {
    var xhr = new XMLHttpRequest();
    xhr.open("POST", serv, true);
    xhr.setRequestHeader('Content-Type', 'application/json'); // application/x-www-form-urlencoded
    alert('b = '+b);
    xhr.send(b);
    //----------------------
         xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
               alert('xhr.readyState == 4  : answer from server is come');
               if(xhr.status == 200) {
                  var xyz = JSON.parse(xhr.responseText);
... обработка


по alert('b = '+b);
вижу сформированную строку json: b = {"0":"1","1":"123"}
т.е. уходят данные аяксом, в данном случае "123" - то что введено в поле браузера ...
и срабатывает второй алёрт: `xhr.readyState == 4 : answer from server is come`
Как принять в main.rs данные "123" и, например, что-то к ним добавив, так: "12345"
отправить обратно клиенту в браузер, где в коде js получить "12345"?
  • Вопрос задан
  • 187 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы