1个不稳定版本

使用旧的Rust 2015

0.1.0 2018年10月31日

#53 in #json-api

MIT/Apache

18KB
255

Breadboard 🍞🛹

Breadboard是一个简单的JSON API请求路由器,用于hyper

也许以后它会变得更加复杂。

它还处于早期开发阶段,但您可能会发现它很有用。欢迎您的反馈。


lib.rs:

Breadboard是一个简单的JSON API请求路由器,用于hyper

就像电子面包板一样,Breadboard非常适合用于API的原型设计。同样,就像电子面包板一样,它的功能有限,如果使用过度,它会断裂。

要创建一个hyper Service,创建一个带有Breadboard::newBreadboard,使用如Breadboard::get这样的方法添加处理器,然后在hyper::server::Builder::serve中使用它。

快速入门

extern crate breadboard;
extern crate hyper;

use breadboard::Breadboard;
use hyper::server::Server;
use hyper::{Request, Response};
use std::string::ParseError; // waiting for `!`

fn hello(_: Request<()>) -> Result<Response<&'static str>, ParseError> {
    Ok(Response::new("Hello, world!"))
}

let board = Breadboard::new().get("/", hello);
let server = Server::bind(&"127.0.0.1:3000".parse().unwrap())
    .serve(board);
// hyper::rt::run(server.map_err(|e| eprintln!("server error: {}", e)));

您还可以使用闭包作为处理器

let board = Breadboard::new().get(
    "/",
    |_: Request<()>| -> Result<Response<&'static str>, ParseError> {
        Ok(Response::new("Hello, world!"))
    },
);
let server = Server::bind(&"127.0.0.1:3000".parse().unwrap())
    .serve(board);

返回Futures的处理器

处理器返回一个实现IntoFuture的类型。这包括Result,以及所有实现Future的类型。

此示例处理器发送HTTP请求,并以收到的响应进行响应。它返回一个在请求完成后解决的Future

extern crate breadboard;
extern crate hyper;

use breadboard::Breadboard;
use hyper::client::Client;
use hyper::rt::{Future, Stream};
use hyper::server::Server;
use hyper::{Body, Request, Response};

fn proxy(_: Request<()>) -> impl Future<Item = Response<Vec<u8>>, Error = hyper::Error> {
    let client: Client<_, Body> = Client::builder().build_http();
    client
        .get("http://icanhazip.com/".parse().unwrap())
        .and_then(|response| {
            let (parts, body) = response.into_parts();
            body.concat2()
                .map(|chunk| Response::from_parts(parts, chunk.into_bytes().to_vec()))
        })
}

let board = Breadboard::new().get("/", proxy);
let server = Server::bind(&"127.0.0.1:3000".parse().unwrap())
    .serve(board);

反序列化和序列化

Breadboard真正的力量在于,只要请求和响应体分别实现Deserialize和Serialize,它们可以是任何内容。

extern crate breadboard;
extern crate hyper;
extern crate serde;
#[macro_use]
extern crate serde_derive;

use breadboard::Breadboard;
use hyper::client::Client;
use hyper::rt::{Future, Stream};
use hyper::server::Server;
use hyper::{Body, Request, Response};
use std::string::ParseError; // waiting for `!`

#[derive(Debug, Deserialize)]
struct Message {
    message: String,
}

fn message(request: Request<Message>) -> Result<Response<String>, ParseError> {
    Ok(Response::new(request.into_body().message))
}

let board = Breadboard::new().post("/", message);
let server = Server::bind(&"127.0.0.1:3000".parse().unwrap())
    .serve(board);

依赖关系

~8.5MB
~155K SLoC