#spin #http-request #component #sdk #serverless #key-value-store #build

bin+lib spin-sdk

Spin Rust SDK使您能够轻松地在Rust中构建Spin组件。

4个稳定版本

3.0.1 2024年3月21日
3.0.0 2024年3月8日
2.2.0 2024年1月30日
2.1.0 2023年12月14日
0.0.0 2022年4月5日

#4#spin

Download history 1040/week @ 2024-04-22 907/week @ 2024-04-29 939/week @ 2024-05-06 909/week @ 2024-05-13 933/week @ 2024-05-20 801/week @ 2024-05-27 514/week @ 2024-06-03 754/week @ 2024-06-10 1135/week @ 2024-06-17 722/week @ 2024-06-24 423/week @ 2024-07-01 656/week @ 2024-07-08 612/week @ 2024-07-15 1394/week @ 2024-07-22 1154/week @ 2024-07-29 522/week @ 2024-08-05

3,749 每月下载次数
用于 9 个crate(7个直接使用)

Apache-2.0 WITH LLVM-exception

115KB
2.5K SLoC

Spin Rust SDK

Spin Rust SDK使您能够轻松地在Rust中构建Spin组件。

Fermyon开发者主页

README文件提供了一些示例,例如使用Rust编写Spin HTTP组件和发起HTTP请求。有关详细信息,请访问官方Fermyon开发者主页。此资源包括安装Spin的页面快速入门指南以及语言支持概述页面。后者列出了Spin的所有功能——包括键值存储、SQLite、MySQL、Redis、Serverless AI等——以及它们在Rust、TS/JS、Python和TinyGo等特定语言中的实现。

在Rust中编写Spin HTTP组件

此库简化了编写Spin HTTP组件的过程。以下是一个此类组件的示例

// lib.rs
use spin_sdk::http::{IntoResponse, Request, Response};
use spin_sdk::http_component;

/// A simple Spin HTTP component.
#[http_component]
fn handle_hello_world(req: Request) -> anyhow::Result<impl IntoResponse> {
    println!("Handling request to {:?}", req.header("spin-full-url"));
    Ok(Response::builder()
        .status(200)
        .header("content-type", "text/plain")
        .body("Hello, Fermyon")
        .build())
}

关于上述函数需要注意的重要事项

  • 在代码spin_sdk::http_component宏标记该函数为Spin组件的入口点
  • 在函数签名(fn handle_hello_world(req: Request) -> anyhow::Result<impl IntoResponse>)中,req可以是任何类型,包括内置的Request类型或来自流行的httpcrate的http::Request类型。
  • 在函数签名中,响应类型可以是任何实现了IntoResponse的类型,这意味着返回类型可以是任意数量的类型,包括anyhow::Result<impl IntoResponse>(如上所示),impl IntoResponseResponseanyhow::Result<Response>,甚至是来自http包的http::Response类型。
    • 注意:使用http包需要在您的Cargo.toml清单中添加它(即,cargo add http)。

发起外部HTTP请求

让我们看一个例子,其中组件向服务器发起外部HTTP请求,修改结果,然后返回它

use spin_sdk::{
    http::{IntoResponse, Request, Method, Response},
    http_component,
};

#[http_component]
async fn handle_hello_world(_req: Request) -> Result<impl IntoResponse> {
    // Create the outbound request object
    let req = Request::builder()
        .method(Method::Get)
        .uri("https://random-data-api.fermyon.app/animals/json")
        .build();

    // Send the request and await the response
    let res: Response = spin_sdk::http::send(req).await?;

    println!("{:?}", res);  // log the response
    Ok(res)
}

为了让上述组件能够发起外部HTTP请求,必须在Spin应用程序的清单中声明目标主机,使用allowed_outbound_hosts配置(在spin.toml文件中)

spin_manifest_version = 2

[application]
name = "hello_world"
version = "0.1.0"
authors = ["Your Name <[email protected]>"]
description = "An example application"

[[trigger.http]]
route = "/..."
component = "hello-world"

[component.hello-world]
source = "target/wasm32-wasi/release/hello_world.wasm"
allowed_outbound_hosts = ["https://random-data-api.fermyon.app"]
[component.hello-world.build]
command = "cargo build --target wasm32-wasi --release"
watch = ["src/**/*.rs", "Cargo.toml"]

构建和运行Spin应用程序

可以使用Spin构建来构建在Spin清单文件中定义的所有组件,并且还有一个标志在编译完成后启动应用程序,spin build --up

$ spin build --up
Building component hello-world with `cargo build --target wasm32-wasi --release`
    Finished release [optimized] target(s) in 0.12s
Finished building all Spin components
Logging component stdio to ".spin/logs/"

Serving http://127.0.0.1:3000
Available Routes:
  hello-world: http://127.0.0.1:3000 (wildcard)

一旦我们的应用程序正在运行,我们可以在浏览器中访问https://127.0.0.1:3000/或使用以下示例中的curl来发起请求

$ curl -i localhost:3000
HTTP/1.1 200 OK
content-length: 77
content-type: application/json

{"timestamp":1702599575198,"fact":"Sharks lay the biggest eggs in the world"}

依赖项

~3.5MB
~75K SLoC