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 |
|
#4 在 #spin
3,749 每月下载次数
用于 9 个crate(7个直接使用)
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
类型或来自流行的http
crate的http::Request
类型。 - 在函数签名中,响应类型可以是任何实现了
IntoResponse
的类型,这意味着返回类型可以是任意数量的类型,包括anyhow::Result<impl IntoResponse>
(如上所示),impl IntoResponse
,Response
,anyhow::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