2个不稳定版本
使用旧的Rust 2015
0.2.0 | 2018年10月7日 |
---|---|
0.1.0 | 2018年9月15日 |
#47 in #share
在canapi-stdweb中使用
6KB
Canapi
常见的Canapi特性。
Canapi是一个Rust crate集合,使得在客户端和服务器之间共享REST API定义成为可能。您定义您的端点(Endpoint
特性),将它们绑定到您的数据库(Provider
特性),然后您可以在您的客户端(Fetch
特性)中重用这些端点。
这需要三个独立的crate:一个用于您的API定义,一个用于您的服务器,一个用于客户端。
示例
my-api
,在此处定义API。
use canapi::Endpoint;
#[derive(Default, Serialize, Deserialize)]
struct UserEndpoint {
id: Option<i32>,
name: Option<String>,
bio: Option<String>,
}
impl Endpoint for PostEndpoint {
type Id = i32;
fn endpoint() -> &'static str {
"/api/v1/users"
}
}
my-server
,将端点绑定到数据库(并将它们暴露给外界)
use canapi::Provider;
use diesel::*; // Example with Diesel
use my_api::UserEndpoint;
/// Define the User model…
impl Provider<PgConnection> for User {
type Data = UserEndpoint;
fn get(conn: &PgConnection, id: i32) -> Option<Post> {
posts::table.filter(posts::id.eq(id))
.limit(1)
.get_result::<Post>(conn)
.ok()
}
}
// Use rocket, actix-web, iron, gotham or whatever you want to expose your endpoints…
my-client
,使用您的API(此处使用潜在的WASM Fetch
实现)
use canapi_wasm::WasmFetch;
use plume_api;
#[derive(Default)]
pub struct Api {
users: UserEndpoint
}
fn fetch_first_post() {
let api = Api::default();
let post = api.users.get::<WasmFetch>(1);
assert_eq(post.id, Some(1));
}
fn find_hello() {
let api = Api::default();
let post = api.users.find::<WasmFetch>(PostEndpoint {
name: Some(String::new("Jane")),
..PostEndpoint::default()
});
assert_eq!(post.title, Some(String::new("Jane")));
}
依赖关系
~110–350KB