|
Re0: 从零开始的 Rust For Cloudflare Workers 教程
本文由 High Ping Network 的小伙伴 GenshinMinecraft 撰写,首发于 本博客
前言
一直想成为 Workers 开发者,苦于不会 JavaScript 和 TypeScript,所以一直搁置。得知 Cloudflare 官方支持 Rust 后,决定写一篇教程。
你需要以下准备:
Rust 开发环境 (最新稳定版)Node.js 开发环境 (20 LTS)网络环境Cloudflare 账号一点 Rust 基础
本文以网易云音乐直链 API 为例,讲解 Rust On Cloudflare Workers 的使用。
初始化项目
安装 Rust Wasm Toolchain:
rustup target add wasm32-unknown-unknown
安装 cargo-generate:
cargo install cargo-generate
创建项目:
cargo generate cloudflare/workers-rs
选择 templates/hello-world 模板,自定义项目名称为 netease-url。
编写代码
使用你喜欢的编辑器,本文以 RustRover 为例。
获取直链函数
调用 API:https://oiapi.net/API/Music_163?id=NETEASEMUSICID&n=1
使用 Reqwest 作为请求库,在 Cargo.toml 中添加 reqwest 和 serde_json 依赖,并附带一些 features。
[dependencies]
...
reqwest = { version = "0.12.7", features = ["json"]}
serde_json = "1.0.128"
在 src/lib.rs 中编写 API 调用函数:
pub async fn get_163_url(id: u64) -> std::result::Result {
let client = Client::new();
let url = format!("https://oiapi.net/API/Music_163?id={}&n=1", id);
let resp = match client.get(&url).send().await {
Ok(resp) => resp,
Err(_) => return Err(String::from("Failed to fetch data")),
};
if !resp.status().is_success() {
return Err(String::from("Failed to fetch data"));
}
let json: Value = match resp.json().await {
Ok(json) => json,
Err(_) => return Err(String::from("Failed to parse JSON")),
};
let data = match json["data"].as_array() {
Some(data) => data,
None => return Err(String::from("No data found")),
};
let song = match data.get(0) {
Some(song) => song,
None => return Err(String::from("No song found")),
};
let url = match song.get("url") {
Some(url) => url.to_string(),
None => return Err(String::from("No URL found")),
};
let url = &url[1..url.len()-1];
Ok(url.to_string())
}
函数接收一个网易云音乐 ID,发送请求获取音乐直链,返回值为 Result。
编写主函数
Workers 基于路由,需要一个路由响应请求。
#[event(fetch)]
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result {
let router = Router::new();
router.run(req, env).await
}
主函数接收路由,在 router 中实现业务逻辑。
主页
编写返回字符串的简单主页:
#[event(fetch)]
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result {
let router = Router::new();
router
.get_async("/", |_, _| async move {
Response:k("How to use: http://xxx.xxx/SongID\nExample: https://netease-url.genshinminecraft-d20.workers.dev/406716121")
})
.run(req, env).await
}
执行 npx wrangler dev 在本地 8787 端口查看实例。
|
|