-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathindex.html
78 lines (78 loc) · 18.8 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<!doctype html><html lang=en><head><meta name=generator content="Hugo 0.79.1"><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta http-equiv=x-ua-compatible content="ie=edge"><link rel=stylesheet href=https://actix.rs/css/bootstrap-reboot.css><link rel=stylesheet href=https://actix.rs/css/bootstrap.css><link rel=stylesheet href=https://actix.rs/css/font-awesome.min.css><link rel=stylesheet href=https://actix.rs/css/actix.css><link rel=stylesheet href=https://actix.rs/css/highlight.css><link rel=icon href=https://actix.rs/favicon.ico title=actix><title>Actix Web | A powerful, pragmatic, and extremely fast web framework for Rust.</title></head><body><header class="navbar navbar-light navbar-toggleable-md bd-navbar"><nav class=actix-main-nav><div class="d-flex justify-content-between hidden-lg-up"><a href=https://actix.rs/ class=navbar-brand><img src=https://actix.rs/img/logo-nav.png class=align-middle alt></a>
<button class="navbar-toggle collapsed" type=button data-toggle=collapse data-target=#actix-main-nav aria-label="Toggle navigation" aria-controls=actix-main-nav aria-expanded=false>
<span class=navbar-toggler-icon></span></button></div><div class="navbar-collapse collapse" id=actix-main-nav><ul class="nav navbar-nav"><li class="nav-item hd-lg-down"><a class=navbar-brand href=https://actix.rs/><img src=https://actix.rs/img/logo-nav.png class=align-middle alt></a></li><li class=nav-item><a class=nav-link href=https://actix.rs/>Home</a></li><li class=nav-item><a class=nav-link href=https://actix.rs/docs/>Documentation</a></li><li class=nav-item><a class=nav-link href=https://actix.rs/community/>Community</a></li><li class=nav-item><a class=nav-link href=https://actix.rs/code/>Code</a></li></ul></div></nav></header><div id=act-home><div class=jumbotron><div class=actix-jumbotron><img src=https://actix.rs/img/logo-large.png class="align-middle actix-logo" alt><p class=lead>A powerful, pragmatic, and extremely fast web framework for Rust</p><a href=https://actix.rs/docs/getting-started/ class="btn btn-secondary actix-jumbotron-install">Get Started</a></div></div><div class="container actix-home"><div class=row><div class=col-md-4><div class=actix-features><h2><i class="fa fa-fw fa-shield" aria-hidden=true></i>Type Safe</h2><p>Forget about stringly typed objects, from request to response, everything has types.</p><h2><i class="fa fa-fw fa-battery-full" aria-hidden=true></i>Feature Rich</h2><p>Out of the box logging, body compression, static file serving, TLS, HTTP/2, and
much more.</p><h2><i class="fa fa-fw fa-puzzle-piece" aria-hidden=true></i>Extensible</h2><p>Easily create and share reusable components for any Actix Web application.</p><h2><i class="fa fa-fw fa-dashboard" aria-hidden=true></i>Blazingly Fast</h2><p>Actix Web is blazingly fast. Don't take our word for it -- <a href="https://www.techempower.com/benchmarks/#section=data-r20&hw=ph&test=fortune">see for yourself!</a></p></div></div><div class=col-md-8><div class=actix-content><div class=highlight><pre class=chroma><code class=language-rust data-lang=rust><span class=k>use</span><span class=w> </span><span class=n>actix_web</span>::<span class=p>{</span><span class=n>get</span><span class=p>,</span><span class=w> </span><span class=n>web</span><span class=p>,</span><span class=w> </span><span class=n>App</span><span class=p>,</span><span class=w> </span><span class=n>HttpServer</span><span class=p>,</span><span class=w> </span><span class=n>Responder</span><span class=p>};</span><span class=w>
</span><span class=w>
</span><span class=w></span><span class=cp>#[get(</span><span class=s>"/hello/{name}"</span><span class=cp>)]</span><span class=w>
</span><span class=w></span><span class=k>async</span><span class=w> </span><span class=k>fn</span> <span class=nf>greet</span><span class=p>(</span><span class=n>name</span>: <span class=nc>web</span>::<span class=n>Path</span><span class=o><</span><span class=nb>String</span><span class=o>></span><span class=p>)</span><span class=w> </span>-> <span class=nc>impl</span><span class=w> </span><span class=n>Responder</span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=n>format</span><span class=o>!</span><span class=p>(</span><span class=s>"Hello {name}!"</span><span class=p>)</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span><span class=w>
</span><span class=w></span><span class=cp>#[actix_web::main]</span><span class=w> </span><span class=c1>// or #[tokio::main]
</span><span class=c1></span><span class=k>async</span><span class=w> </span><span class=k>fn</span> <span class=nf>main</span><span class=p>()</span><span class=w> </span>-> <span class=nc>std</span>::<span class=n>io</span>::<span class=nb>Result</span><span class=o><</span><span class=p>()</span><span class=o>></span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=n>HttpServer</span>::<span class=n>new</span><span class=p>(</span><span class=o>||</span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=n>App</span>::<span class=n>new</span><span class=p>()</span><span class=w>
</span><span class=w> </span><span class=p>.</span><span class=n>route</span><span class=p>(</span><span class=s>"/hello"</span><span class=p>,</span><span class=w> </span><span class=n>web</span>::<span class=n>get</span><span class=p>().</span><span class=n>to</span><span class=p>(</span><span class=o>||</span><span class=w> </span><span class=k>async</span><span class=w> </span><span class=p>{</span><span class=w> </span><span class=s>"Hello World!"</span><span class=w> </span><span class=p>}))</span><span class=w>
</span><span class=w> </span><span class=p>.</span><span class=n>service</span><span class=p>(</span><span class=n>greet</span><span class=p>)</span><span class=w>
</span><span class=w> </span><span class=p>})</span><span class=w>
</span><span class=w> </span><span class=p>.</span><span class=n>bind</span><span class=p>((</span><span class=s>"127.0.0.1"</span><span class=p>,</span><span class=w> </span><span class=mi>8080</span><span class=p>))</span><span class=o>?</span><span class=w>
</span><span class=w> </span><span class=p>.</span><span class=n>run</span><span class=p>()</span><span class=w>
</span><span class=w> </span><span class=p>.</span><span class=k>await</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span></code></pre></div></div></div></div><div class=actix-showcase><div class=col-md-9><div class=actix-feature id=responders><h2>Flexible Responders</h2><p>Handler functions in Actix Web can return a wide range of objects that
implement the <code>Responder</code> trait. This makes it a breeze
to return consistent responses from your APIs.</p><div class=highlight><pre class=chroma><code class=language-rust data-lang=rust><span class=k>async</span><span class=w> </span><span class=k>fn</span> <span class=nf>current_temperature</span><span class=p>()</span><span class=w> </span>-> <span class=nc>impl</span><span class=w> </span><span class=n>Responder</span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=n>web</span>::<span class=n>Json</span><span class=p>(</span><span class=n>json</span><span class=o>!</span><span class=p>({</span><span class=w> </span><span class=s>"temperature"</span>: <span class=mf>42.3</span><span class=w> </span><span class=p>}))</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span><span class=w>
</span><span class=w></span><span class=k>async</span><span class=w> </span><span class=k>fn</span> <span class=nf>hello_world</span><span class=p>()</span><span class=w> </span>-> <span class=nc>actix_web</span>::<span class=nb>Result</span><span class=o><</span><span class=k>impl</span><span class=w> </span><span class=n>Responder</span><span class=o>></span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=nb>Ok</span><span class=p>(</span><span class=s>"Hello World!"</span><span class=p>)</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span></code></pre></div></div><div class=actix-feature id=extractors><h2>Powerful Extractors</h2><p>Actix Web comes with a powerful extractor system that extracts parts of the incoming
HTTP request and passes it to your handler functions.</p><p>A handler function can receive up to 12 arguments that implement the
<code>FromRequest</code> trait, in any order, and Actix Web will automatically extract
them from the request and provide them. It feels like magic!</p><div class=highlight><pre class=chroma><code class=language-rust data-lang=rust><span class=cp>#[derive(Deserialize, Serialize)]</span><span class=w>
</span><span class=w></span><span class=k>struct</span> <span class=nc>EventForm</span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=n>kind</span>: <span class=nb>String</span><span class=p>,</span><span class=w>
</span><span class=w> </span><span class=n>tags</span>: <span class=nb>Vec</span><span class=o><</span><span class=nb>String</span><span class=o>></span><span class=p>,</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span><span class=w>
</span><span class=w></span><span class=k>async</span><span class=w> </span><span class=k>fn</span> <span class=nf>capture_event</span><span class=p>(</span><span class=n>evt</span>: <span class=nc>web</span>::<span class=n>Json</span><span class=o><</span><span class=n>EventForm</span><span class=o>></span><span class=p>,</span><span class=w> </span><span class=n>db</span>: <span class=nc>web</span>::<span class=n>Data</span><span class=o><</span><span class=n>Db</span><span class=o>></span><span class=p>)</span><span class=w> </span>-> <span class=nc>impl</span><span class=w> </span><span class=n>Responder</span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=kd>let</span><span class=w> </span><span class=n>new_event</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>db</span><span class=p>.</span><span class=n>store</span><span class=p>(</span><span class=o>&</span><span class=n>evt</span><span class=p>.</span><span class=n>kind</span><span class=p>,</span><span class=w> </span><span class=o>&</span><span class=n>evt</span><span class=p>.</span><span class=n>tags</span><span class=p>).</span><span class=k>await</span><span class=p>;</span><span class=w>
</span><span class=w> </span><span class=n>format</span><span class=o>!</span><span class=p>(</span><span class=s>"got event {}"</span><span class=p>,</span><span class=w> </span><span class=n>new_event</span><span class=p>.</span><span class=n>id</span><span class=p>.</span><span class=n>unwrap</span><span class=p>())</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span></code></pre></div></div><div class=actix-feature id=forms><h2>Easy Form Handling</h2><p>Handling multipart/urlencoded form data is easy. Just define a structure that can be
deserialized and Actix Web will handle the rest.</p><div class=highlight><pre class=chroma><code class=language-rust data-lang=rust><span class=k>use</span><span class=w> </span><span class=n>actix_web</span>::<span class=n>web</span>::<span class=p>{</span><span class=n>Either</span><span class=p>,</span><span class=w> </span><span class=n>Json</span><span class=p>,</span><span class=w> </span><span class=n>Form</span><span class=p>};</span><span class=w>
</span><span class=w>
</span><span class=w></span><span class=cp>#[derive(Deserialize)]</span><span class=w>
</span><span class=w></span><span class=k>struct</span> <span class=nc>Register</span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=n>username</span>: <span class=nb>String</span><span class=p>,</span><span class=w>
</span><span class=w> </span><span class=n>country</span>: <span class=nb>String</span><span class=p>,</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span><span class=w>
</span><span class=w></span><span class=c1>// register form is JSON
</span><span class=c1></span><span class=k>async</span><span class=w> </span><span class=k>fn</span> <span class=nf>register</span><span class=p>(</span><span class=n>form</span>: <span class=nc>web</span>::<span class=n>Json</span><span class=o><</span><span class=n>Register</span><span class=o>></span><span class=p>)</span><span class=w> </span>-> <span class=nc>impl</span><span class=w> </span><span class=n>Responder</span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=n>format</span><span class=o>!</span><span class=p>(</span><span class=s>"Hello {} from {}!"</span><span class=p>,</span><span class=w> </span><span class=n>form</span><span class=p>.</span><span class=n>username</span><span class=p>,</span><span class=w> </span><span class=n>form</span><span class=p>.</span><span class=n>country</span><span class=p>)</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span><span class=w>
</span><span class=w></span><span class=c1>// register form can be either JSON or URL-encoded
</span><span class=c1></span><span class=k>async</span><span class=w> </span><span class=k>fn</span> <span class=nf>register</span><span class=p>(</span><span class=n>form</span>: <span class=nc>Either</span><span class=o><</span><span class=n>Json</span><span class=o><</span><span class=n>Register</span><span class=o>></span><span class=p>,</span><span class=w> </span><span class=n>Form</span><span class=o><</span><span class=n>Register</span><span class=o>>></span><span class=p>)</span><span class=w> </span>-> <span class=nc>impl</span><span class=w> </span><span class=n>Responder</span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=kd>let</span><span class=w> </span><span class=n>Register</span><span class=w> </span><span class=p>{</span><span class=w> </span><span class=n>username</span><span class=p>,</span><span class=w> </span><span class=n>country</span><span class=w> </span><span class=p>}</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>form</span><span class=p>.</span><span class=n>into_inner</span><span class=p>();</span><span class=w>
</span><span class=w> </span><span class=n>format</span><span class=o>!</span><span class=p>(</span><span class=s>"Hello {username} from {country}!"</span><span class=p>)</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span></code></pre></div></div><div class=actix-feature id=routing><h2>Request Routing</h2><p>The built-in Actix Web request router can be used with or without macros attached to
handlers, and always provides flexible and composable methods of creating routing
tables.</p><p>Includes support for matching dynamic path segments, path prefix groups, and custom
routing guards which let you define your own rules.</p><div class=highlight><pre class=chroma><code class=language-rust data-lang=rust><span class=cp>#[get(</span><span class=s>"/"</span><span class=cp>)]</span><span class=w>
</span><span class=w></span><span class=k>async</span><span class=w> </span><span class=k>fn</span> <span class=nf>index</span><span class=p>(</span><span class=n>_req</span>: <span class=nc>HttpRequest</span><span class=p>)</span><span class=w> </span>-> <span class=nc>impl</span><span class=w> </span><span class=n>Responder</span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=s>"Hello from the index page!"</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span><span class=w>
</span><span class=w></span><span class=k>async</span><span class=w> </span><span class=k>fn</span> <span class=nf>hello</span><span class=p>(</span><span class=n>path</span>: <span class=nc>web</span>::<span class=n>Path</span><span class=o><</span><span class=nb>String</span><span class=o>></span><span class=p>)</span><span class=w> </span>-> <span class=nc>impl</span><span class=w> </span><span class=n>Responder</span><span class=w> </span><span class=p>{</span><span class=w>
</span><span class=w> </span><span class=n>format</span><span class=o>!</span><span class=p>(</span><span class=s>"Hello {}!"</span><span class=p>,</span><span class=w> </span><span class=o>&</span><span class=n>path</span><span class=p>)</span><span class=w>
</span><span class=w></span><span class=p>}</span><span class=w>
</span><span class=w>
</span><span class=w></span><span class=kd>let</span><span class=w> </span><span class=n>app</span><span class=w> </span><span class=o>=</span><span class=w> </span><span class=n>App</span>::<span class=n>new</span><span class=p>()</span><span class=w>
</span><span class=w> </span><span class=p>.</span><span class=n>service</span><span class=p>(</span><span class=n>index</span><span class=p>)</span><span class=w>
</span><span class=w> </span><span class=p>.</span><span class=n>route</span><span class=p>(</span><span class=s>"/{name}"</span><span class=p>,</span><span class=w> </span><span class=n>web</span>::<span class=n>get</span><span class=p>().</span><span class=n>to</span><span class=p>(</span><span class=n>hello</span><span class=p>));</span><span class=w>
</span></code></pre></div></div></div><div class="col-md-3 actix-feature-selectors"><ul><li class=actix-feature-selector><a href=#responders>flexible responders</a></li><li class=actix-feature-selector><a href=#extractors>powerful extractors</a></li><li class=actix-feature-selector><a href=#forms>easy form handling</a></li><li class=actix-feature-selector><a href=#routing>request routing</a></li></ul></div></div></div></div><footer class=actix-footer><div class="text-muted actix-footer-gray d-flex justify-content-between"><div class=actix-footer-info>Copyright © 2022 The Actix Team</div><div class=actix-footer-social><a href=https://github.com/actix class=text-muted><i class="fa fa-github" aria-hidden=true></i></a></div></div></footer><script src=https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js integrity=sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7 crossorigin=anonymous></script><script src=https://cdnjs.cloudflare.com/ajax/libs/tether/1.3.7/js/tether.min.js integrity=sha384-XTs3FgkjiBgo8qjEjBk0tGmf3wPrWtA6coPfQDfFEY8AnYJwjalXCiosYRBIBZX8 crossorigin=anonymous></script><script src=https://actix.rs/js/bootstrap.min.js></script><script src=https://actix.rs/js/actix.js></script></body></html>