admin 发表于 2024-9-24 00:25:05

Rust for Cloudflare Workers: 零基础入门教程

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。


...
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;
    Ok(url.to_string())
}

函数接收一个网易云音乐 ID,发送请求获取音乐直链,返回值为 Result。

编写主函数
Workers 基于路由,需要一个路由响应请求。

#
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result {
    let router = Router::new();
    router.run(req, env).await
}

主函数接收路由,在 router 中实现业务逻辑。

主页
编写返回字符串的简单主页:

#
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result {
    let router = Router::new();
    router
      .get_async("/", |_, _| async move {
            Response::ok("How to use: http://xxx.xxx/SongID\nExample: https://netease-url.genshinminecraft-d20.workers.dev/406716121")
      })
      .run(req, env).await
}

执行 npx wrangler dev 在本地 8787 端口查看实例。
页: [1]
查看完整版本: Rust for Cloudflare Workers: 零基础入门教程