1 个不稳定版本

0.1.0 2023年10月23日

#8#vercel

Apache-2.0

36KB
635

Rust Vercel Blob 客户端

此包包含一个用于与 Vercel Blob API 交互的 Rust 客户端。该客户端可用于应用程序内部(例如,使用 rust 运行时 的无服务器函数)以及应用程序外部(例如,基于 Rust 的文件上传客户端)

身份验证

在应用程序内部

如果您的 Rust 代码是 Rust 无服务器函数的一部分,则身份验证是自动的,并作为 Vercel 运行时的一部分提供。

在应用程序外部

如果您的 Rust 代码是客户端包的一部分(通过 wasm 在浏览器中运行或运行某种自定义客户端应用程序),则您需要获取一个身份验证令牌。这可以通过在您的服务器中创建一个路由来实现,该路由将为授权用户提供短期身份验证令牌。crate 文档中包含了一个示例。


lib.rs:

Vercel Blob API 允许您在 Vercel 应用程序中上传和托管文件。

此包提供了一种 Rust 客户端来访问 API 功能。

这些客户端可用于 Vercel 函数以及自定义客户端应用程序中的 Vercel 函数之外。

要使用客户端,您只需要实例化一个 VercelBlobClient


let client = VercelBlobClient::new();

let list_result = client.list(Default::default()).await.unwrap();
for blob in list_result.blobs {
    dbg!(blob.url);
}

要在外部使用客户端,您需要创建一个令牌提供者。具体取决于您的应用程序。例如,您可能创建一个路由以向已验证用户提供短期令牌。在 快速入门指南 中有一个这样的路由示例。您的令牌提供者可以对此路由进行请求

use async_trait::async_trait;
use reqwest::Client;
use serde::Deserialize;
use serde::Serialize;

#[derive(Debug, Serialize)]
struct UploadTokenRequestPayload {
    pathname: String,
    #[serde(rename = "callbackUrl")]
    callback_url: String,
}

#[derive(Debug, Serialize)]
struct UploadTokenRequest {
    #[serde(rename = "type")]
    request_type: String,
    payload: UploadTokenRequestPayload,
}

#[derive(Debug, Deserialize)]
struct UploadTokenResponse {
    #[serde(rename = "type")]
    response_type: String,
    #[serde(rename = "clientToken")]
    client_token: String,
}

#[derive(Debug)]
struct MyAppTokenProvider {
    request_url: String,
    client: Client,
}

#[async_trait]
impl TokenProvider for MyAppTokenProvider {
    async fn get_token(
        &self,
        _operation: &str,
        pathname: Option<&str>,
    ) -> Result<String, VercelBlobError> {
        let request = self.client.post(&self.request_url);
        let request = request.json(&UploadTokenRequest {
            request_type: "blob.generate-client-token".to_string(),
            payload: UploadTokenRequestPayload {
                pathname: pathname.unwrap_or("").to_string(),
                callback_url: self.request_url.to_string(),
            },
        });

        // Depending on how your app handles authorization you may need to
        // attach a cookie or other authorization header to the request.

        let http_response = request.send().await?;
        let token_rsp = http_response.json::<UploadTokenResponse>().await?;
        Ok(token_rsp.client_token)
    }
}

#[tokio::main]
async fn main() {
    // ...
    // Some kind of login workflow should take place before using the client
    // ...

    let http_client = Client::new();
    let provider = Arc::new(MyAppTokenProvider {
        request_url: "https://127.0.0.1:3000/api/upload".to_string(),
        client: http_client,
    });

    // Now we can make authorized requests to the Vercel Blob Storage API
    let blob_client = VercelBlobClient::new_external(provider);
    for blob in blob_client.list(Default::default()).await.unwrap().blobs {
        println!("{:?}", blob);
    }
}

依赖关系

~5–16MB
~242K SLoC