1 个不稳定版本

使用旧的Rust 2015

0.0.1 2018年8月6日

#78#warp


用于 warp_dsl

MIT 许可证

12KB
284

warp-dsl

Build Status

用于编写warp路由的DSL,受warpAkka HTTP启发。

目前,这个实现只是一个概念验证。

它在Rust稳定版上运行,使用proc-macro-hack

入门指南

  1. 将以下依赖项添加到您的 Cargo.toml

    [dependencies]
    warp = "0.1"
    warp_dsl = "0.0.1"
    
  2. 使用 #[macro_use] 声明这两个crate

    #[macro_use] extern crate warp;
    #[macro_use] extern crate warp_dsl;
    
  3. 编写一些路由

    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()
getpostput、… 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