Rust github: https://github.com/tokio-rs/axum
use axum:: {
	routing::{get, post},
	http::StatusCode,
	response::IntoResponse,
	Json, Router,
};
use serde::{Deserialize, Serialize};
use std::net::SocketAddr;
#[tokio::main]
async fn main() {
	tracing_subscriber::fmt::init();
	let app = Router::new()
		.route("/", get(root))
		.route("/users", post(create_user));
	let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
	axum::server(listener, app).await.unwrap();
}
async fn root() -> &'static str {
	"Hello, World"
}
async fn create_user(
	Json(payload): Json<CreateUser>,
) -> (StatusCode, Json<User>){
	let user = User {
		id: 1337,
		username: payload.username,
	};
	(StatusCode::CREATED, Json(user))
}
#[derive(Deserialize)]
struct CreateUser {
	username: String,
}
#[derive(Serialize)]
struct User {
	id: u64,
	username: String,
}
axum project
https://github.com/tokio-rs/axum/blob/main/ECOSYSTEM.md
Cargo.toml
[dependencies]
axum="0.5"
tokio = { version="1", features-["full"] }
main.rs
use axum::{routing::get, Router};
#[tokio::main]
async fn main(){
	let app = Router::new().route("/",  get(|| async {"hello world!"}));
	axum::Server::bind(&&"0.0.0.0:3000".parse().unwrap())
		.serve(app.into_make_service())
		.await
		.unwrap();
}
workspace Cargo.toml
[workspace] members = [ "hello-world" ]
$ cargo new hello-world
[dependencies]
axum = "0.5"
tokio = { version = "1", features = ["full"] }
use axum::{routing::get, Router};
use std::net::SocketAddr;
#[tokio::main]
async fn main() {
	let app = Router::new().route("/", get(handler));
	let addr = SocketAddr::from(([192,168,56,10], 3000));
	axum::Server::bind(&addr)
		.serve(app.into_make_service())
		.await
		.unwrap();
}
async fn handler() -> &'static str {
	"hello world!"
}
/workspace/generate-random-number
[dependencies]
axum = "0.5"
rand = "0.8"
serde = { version = "1", features = ["derive"]}
tokio = { version = "1", features = ["full"]}
use axum::{extract::Query, response::Html, routing::get, Router};
use rand::{thread_rng, Rng};
use serde::Deserialize;
use std::net::SocketAddr;
#[tokio::main]
async fn main() {
	let app = Router::new().route("/", get(handler));
	let addr = SocketAddr::from(([192,168,56,10], 3000));
	println!("listening on {}", addr);
	axum::Server::bind(&addr)
		.serve(app.into_make_service())
		.await
		.unwrap();
}
#[derive(Deserialize)]
struct RangeParameters {
	start: usize,
	end: usize,
}
async fn handler(Query(range): Query<RangeParameters>)-> Html<String> {
	let random_number = thread_rng().gen_range(range.start..range.end);
	Html(format!("<h1>Random Number: {}</h1>", random_number))
}
http://192.168.56.10:3000/?start=50&end=100
use axum::{response::Html, routing::get, Router};
use std::net::SocketAddr;
#[tokio::main]
async fn main() {
	let app = Router::new().route("/", get(handler));
	let addr = SocketAddr::from(([192,168,56,10], 3000));
	axum::Server::bind(&addr)
		.serve(app.into_make_service())
		.await
		.unwrap();
}
async fn handler() -> HTML<&'static str> {
	Html(include_str!("../index.html"))
}