1 个不稳定版本
使用旧的Rust 2015
0.0.1 | 2018年8月6日 |
---|
#78 在 #warp
用于 warp_dsl
12KB
284 行
warp-dsl
用于编写warp路由的DSL,受warp和Akka HTTP启发。
目前,这个实现只是一个概念验证。
它在Rust稳定版上运行,使用proc-macro-hack。
入门指南
-
将以下依赖项添加到您的
Cargo.toml
[dependencies] warp = "0.1" warp_dsl = "0.0.1"
-
使用
#[macro_use]
声明这两个crate#[macro_use] extern crate warp; #[macro_use] extern crate warp_dsl;
-
编写一些路由
use warp::Filter; fn main() { let routes = router!( path("foo" / u64) |num| { get { complete { format!("GET /foo/{}\n", num) } } post { complete { format!("POST /foo/{}\n", num) } } } ); warp::serve(routes).run(([0; 4], 3030)); }
然后,输入 cargo run
以启动包含这些路由的HTTP服务器。
$ cargo run &
$ curl -X POST localhost:3030/foo/1
POST /foo/1
编写路由
本节只是一个草案。需要进一步扩展。
此crate使用了Akka HTTP中的指令概念。
一些常见的过滤器被解析器识别
指令 | 表达式 |
---|---|
path(...) |
path!(...) |
index |
warp::index() |
get 、post 、put 、… |
HTTP方法 |
cookie("..") |
::warp::过滤器::cookie::cookie |
cookie(可选"..") |
::warp::过滤器::cookie::可选 |
任何函数都可以作为指令使用,如果
- 它返回一个
Filter
。 - 表达式被括号包围。
嵌套指令使用Filter::and
组合。同一级别的指令使用Filter::or
组合。
可以使用 &
操作符来组合嵌套指令。 foo & bar { ... }
等同于 foo { bar { ... } }
。
由于在 wrap 0.1 版本中,HTTP 方法不能与 and()
一起使用,因此 HTTP 方法被移动到过滤器顶部。
使用 complete
指令设置响应。
调试
如果您在编写路由时遇到问题,验证生成的代码可能会有所帮助。将 WARPDSL_DEBUG
设置为 output
,然后每个对 router!()
的调用都会打印到 stderr。
使用 入门 部分的代码,您将得到以下输出
======== [DEBUG:OUTPUT] ========
(((::warp::get((path!("foo" / u64)).map(|num| {format ! ( "GET /foo/{}\n" , num )}))))
.or((::warp::post((path!("foo" / u64)).map(|num| {format ! ( "POST /foo/{}\n" , num )})))))
================================
依赖项
~225KB