wit-bindgen
是通过 wit
生成 wasm 绑定函数的库。wit
是 wasm 的类型抽象描述文件,替换原来的 witx
或 wat
格式。wit-bindgen
生成的绑定函数,可以直接在 Rust 代码中调用,不需要手动编写 wasm 代码。
wasmtime
是一个 wasm runtime,可以直接运行 wasm 文件,也可以通过 wasmtime
的 API 在 Rust 代码中调用 wasm 函数。wasm 在 serverless runtime 中的应用,可以通过 wasmtime
来运行能够处理 HTTP 请求的 wasm 文件的。这里以处理 HTTP 请求的能力为例,介绍如何使用 wit-bindgen
和 wasmtime
开发 WebAssembly 应用。
定义 wit 接口并生成代码
首先,我们需要定义一个 wit 接口文件 leaf-http.wit
,用于描述 wasm 文件的能力。这里我们定义一个处理 HTTP 请求的接口,接口定义如下:
interface exports {
// status code
type status = u16
// headers as key value pairs
type headers = list<tuple<string, string>>
// request uri
type uri = string
// body as bytes
type body = list<u8>
// request method
type method = string
// request object
record request{
method: method,
uri: uri,
headers: headers,
body: option<body>,
}
// response object
record response{
status: status,
headers: headers,
body: option<body>,
}
// handle request function
handle-request: func(req: request) -> response
}
// exports the interface
world leaf-http {
default export exports
}
这里定义了一个 handle-request
函数,接收一个 request
对象,返回一个 response
对象。request
对象包含了请求的方法、uri、headers、body 等信息。response
对象包含了响应的状态码、headers、body 等信息。export 的接口名为 leaf-http
。
这里使用 wit_bindgen_gen_guest_rust
生成 rust 代码,生成的代码如下 https://github.com/fuxiaohei/leaf-wasm/blob/0f62fc90ae044edd7861053e1373cdb9dd76bf4d/wit/leaf-http.rs。使用代码生成而不是宏,为了更直观的看到需要编译为 rust 的 wasm 文件的内容。
如果使用宏的姿势,可以参考:
wit_bindgen_guest_rust::generate!("leaf-http.wit");