1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2018年10月31日 |
---|
#53 in #json-api
18KB
255 行
Breadboard 🍞🛹
Breadboard是一个简单的JSON API请求路由器,用于hyper。
也许以后它会变得更加复杂。
它还处于早期开发阶段,但您可能会发现它很有用。欢迎您的反馈。
lib.rs
:
Breadboard是一个简单的JSON API请求路由器,用于hyper。
就像电子面包板一样,Breadboard非常适合用于API的原型设计。同样,就像电子面包板一样,它的功能有限,如果使用过度,它会断裂。
要创建一个hyper Service
,创建一个带有Breadboard::new
的Breadboard
,使用如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