//! Run with //! //! ```not_rust //! cargo run -p example-cors //! ``` use axum::{ http::Method, response::{Html, IntoResponse}, routing::get, Json, Router, }; use std::net::SocketAddr; use tower_http::cors::{CorsLayer, Origin}; #[tokio::main] async fn main() { let frontend = async { let app = Router::new().route("/", get(html)); serve(app, 3000).await; }; let backend = async { let app = Router::new().route("/json", get(json)).layer( // see https://docs.rs/tower-http/latest/tower_http/cors/index.html // for more details CorsLayer::new() .allow_origin(Origin::exact("http://localhost:3000".parse().unwrap())) .allow_methods(vec![Method::GET]), ); serve(app, 4000).await; }; tokio::join!(frontend, backend); } async fn serve(app: Router, port: u16) { let addr = SocketAddr::from(([127, 0, 0, 1], port)); axum::Server::bind(&addr) .serve(app.into_make_service()) .await .unwrap(); } async fn html() -> impl IntoResponse { Html( r#" "#, ) } async fn json() -> impl IntoResponse { Json(vec!["one", "two", "three"]) }