A program is like a poem, you cannot write a poem without writing it. --- Dijkstra
A full-featured and easy-to-use web framework with the Rust programming language.
- Both Ease of use and performance.
- Minimizing the use of generics.
- Blazing fast and flexible routing.
tower::Service
andtower::Layer
compatibility.- Use poem-openapi to write APIs that comply with OAS3 specifications and automatically generate documents.
To avoid compiling unused dependencies, Poem gates certain features, all of which are disabled by default:
Feature | Description |
---|---|
server | Server and listener APIs (enabled by default) |
compression | Support decompress request body and compress response body |
cookie | Support for Cookie |
csrf | Support for Cross-Site Request Forgery (CSRF) protection |
multipart | Support for Multipart |
native-tls | Support for HTTP server over TLS with native-tls |
openssl-tls | Support for HTTP server over TLS with openssl-tls |
opentelemetry | Support for opentelemetry |
prometheus | Support for Prometheus |
redis-session | Support for RedisSession |
rustls | Support for HTTP server over TLS with rustls |
session | Support for session |
sse | Support Server-Sent Events (SSE) |
static-files | Support static files endpoint |
tempfile | Support for tempfile |
tower-compat | Adapters for tower::Layer and tower::Service . |
websocket | Support for WebSocket |
anyhow | Integrate with anyhow crate. |
eyre06 | Integrate with version 0.6.x of the eyre crate. |
i18n | Support for internationalization |
acme-native-roots | Support for ACME(Automatic Certificate Management Environment) |
acme-webpki-roots | Support for ACME using webpki TLS roots rather than native TLS roots |
tokio-metrics | Integrate with tokio-metrics crate. |
embed | Integrate with rust-embed crate. |
xml | Integrate with quick-xml crate. |
yaml | Integrate with serde-yaml crate. |
This crate uses #![forbid(unsafe_code)]
to ensure everything is implemented in 100% Safe Rust.
use poem::{get, handler, listener::TcpListener, web::Path, Route, Server};
#[handler]
fn hello(Path(name): Path<String>) -> String {
format!("hello: {}", name)
}
#[tokio::main]
async fn main() -> Result<(), std::io::Error> {
let app = Route::new().at("/hello/:name", get(hello));
Server::new(TcpListener::bind("0.0.0.0:3000"))
.run(app)
.await
}
More examples can be found here.
The minimum supported Rust version for this crate is 1.67.0
.
🎈 Thanks for your help improving the project! We are so happy to have you!
Licensed under either of
- Apache License, Version 2.0,(LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT) at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Poem by you, shall be licensed as Apache, without any additional terms or conditions.