#client-server #define #endpoint #rest #provider #share #fetch

nightly canapi

定义REST API并在客户端和服务器之间共享

2个不稳定版本

使用旧的Rust 2015

0.2.0 2018年10月7日
0.1.0 2018年9月15日

#47 in #share


canapi-stdweb中使用

AGPL-3.0

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