- Cargo.tmol
- src/main.rs
cargo run を実行します。 ブラウザーや curl でアクセスします。
curl -v http://localhost:3000/
cargo add serde_json を実行して serde_json を追加します。
| [package] | |
| name = "hyper" | |
| version = "0.1.0" | |
| edition = "2021" | |
| [dependencies] | |
| hyper = { version = "1", features = ["full"] } | |
| tokio = { version = "1", features = ["full"] } | |
| hyper-util = { version = "0.1", features = ["full"] } | |
| warp = { version = "0.4", default-features = false } |
| use std::net::SocketAddr; | |
| use hyper::server::conn::http1; | |
| use hyper_util::rt::TokioIo; | |
| use hyper_util::service::TowerToHyperService; | |
| use tokio::net::TcpListener; | |
| #[tokio::main] | |
| async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { | |
| let routes = warp::any().map(|| "Hello, World!".to_string()); | |
| let tower_svc = warp::service(routes); | |
| let hyper_svc = TowerToHyperService::new(tower_svc); | |
| let addr: SocketAddr = ([127, 0, 0, 1], 3000).into(); | |
| let listener = TcpListener::bind(addr).await?; | |
| println!("listening on http://{addr}"); | |
| loop { | |
| let (stream, _peer) = listener.accept().await?; | |
| let io = TokioIo::new(stream); | |
| let svc = hyper_svc.clone(); | |
| tokio::spawn(async move { | |
| if let Err(err) = http1::Builder::new() | |
| .serve_connection(io, svc) | |
| .await | |
| { | |
| eprintln!("error serving connection: {err}"); | |
| } | |
| }); | |
| } | |
| } |
| use std::net::SocketAddr; | |
| use hyper::server::conn::http1; | |
| use hyper_util::rt::TokioIo; | |
| use hyper_util::service::TowerToHyperService; | |
| use tokio::net::TcpListener; | |
| use warp::{Filter, reply}; | |
| use serde_json::json; | |
| #[tokio::main] | |
| async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { | |
| let html_route = warp::path("html") | |
| .map(|| reply::html("<h1>Hello, Warp!</h1>".to_string())); | |
| let json_route = warp::path("json").map(|| { | |
| let obj = json!({ | |
| "message": "Hello, Warp!", | |
| "lang": "rust", | |
| "version": "0.4" | |
| }); | |
| reply::json(&obj) | |
| }); | |
| let routes = html_route.or(json_route); | |
| let tower_svc = warp::service(routes); | |
| let hyper_svc = TowerToHyperService::new(tower_svc); | |
| let addr: SocketAddr = ([127, 0, 0, 1], 3000).into(); | |
| let listener = TcpListener::bind(addr).await?; | |
| println!("listening on http://{addr}"); | |
| loop { | |
| let (stream, _peer) = listener.accept().await?; | |
| let io = TokioIo::new(stream); | |
| let svc = hyper_svc.clone(); // 各コネクション用にクローン | |
| tokio::spawn(async move { | |
| if let Err(err) = http1::Builder::new() | |
| .serve_connection(io, svc) | |
| .await | |
| { | |
| eprintln!("error serving connection: {err}"); | |
| } | |
| }); | |
| } | |
| } |