一元网络论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 121|回复: 0

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

[复制链接]

3万

主题

3万

帖子

9万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
96158
发表于 2024-9-24 00:25:05 | 显示全部楼层 |阅读模式
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 端口查看实例。
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|一元网络论坛

    GMT+8, 2024-11-26 17:27 , Processed in 0.079615 second(s), 20 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表