Add CORS example (#512)

This commit is contained in:
David Pedersen 2021-11-13 22:18:14 +01:00 committed by GitHub
parent e58336621d
commit 20fabd87e9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 69 additions and 0 deletions

10
examples/cors/Cargo.toml Normal file
View file

@ -0,0 +1,10 @@
[package]
name = "example-cors"
version = "0.1.0"
edition = "2018"
publish = false
[dependencies]
axum = { path = "../../axum" }
tokio = { version = "1.0", features = ["full"] }
tower-http = { version = "0.1", features = ["cors"] }

59
examples/cors/src/main.rs Normal file
View file

@ -0,0 +1,59 @@
//! 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#"
<script>
fetch('http://localhost:4000/json')
.then(response => response.json())
.then(data => console.log(data));
</script>
"#,
)
}
async fn json() -> impl IntoResponse {
Json(vec!["one", "two", "three"])
}