Для 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"?