17个版本 (11个重大更新)

0.12.0 2023年10月26日
0.10.0 2023年10月12日

#230 in HTTP客户端

Download history 2/week @ 2024-05-18 6/week @ 2024-07-06 73/week @ 2024-07-27

每月79次下载

MIT许可证

55KB
889

megamind

Crates.io docs.rs (with version)

一个用于与Genius API交互的库。

该库主要提供以下两项功能:

  1. 符合Rust风格的架构(即“数据模型”或其他你喜欢的叫法),用于表示API端点数据。

  2. 一个简单的HTTP客户端,用于与API交互。

用法

megamind = "*"

# enable the "catchall" feature
megamind = { version = "*", features = ["catchall"] }
use std::{env::var, error::Error};

use megamind::{ClientBuilder, models::Response};

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let client = ClientBuilder::new().auth_token(var("GENIUS_TOKEN")?).build()?;
    let response = client.account().await?;
    if let Response::Success { meta, response } = response {
        assert_eq!(meta.status, 200);
        println!("Howdy, {}!", response.account.user.core.name);
    }
    Ok(())
}

功能

官方(由Genius文档记录)

这些端点可以在docs.genius.com上找到,并且可以随时访问。

  • 获取当前用户
  • 获取注释
  • 获取艺术家
  • 获取参照物列表
  • 获取搜索结果
  • 获取用户
  • 获取网页
  • 获取歌曲
  • 创建注释
  • 更新注释
  • 删除注释
  • 对注释进行点赞/踩/取消点赞

非官方(未被Genius文档记录)

这些端点在公共领域找不到,但仍然可以访问。

请勿依赖始终可以访问这些端点,因为Genius可能在任何时候都有权撤销访问权限。

  • 获取专辑
  • 获取参照物

被Genius锁定

这些端点曾经存在(可能在某些嵌套数据模型中找到),但现在无法访问。

  • 获取评论

持续改进

该库可以在以下几个方面进行改进:

  1. 数据模型文档
    • Genius文档缺少许多数据字段的详细信息
    • 即使没有未记录的端点,Web API的表面面积也很大
  2. 数据模型特定性
    • 许多字段可以是枚举类型(enum)而不是字符串(String),但缺乏必要的文档以进行自信的转换
    • 一些字段只是简单的圆括号(())或向量(Vec),因为没有找到包含数据的端点
    • 数据模型字段存在性在端点之间不一致
  3. 数据模型的人体工程学
    • 对于这个库的用户来说,嵌套程度有多深才算过分?
    • 共享和嵌套结构的命名约定有时可能会很尴尬(如 response.account.user.core.name 并不如 response.account.name 直观)
    • 用户可能需要的派生特性比当前提供的更多(例如,EqHash 等)
  4. 错误处理
    • Reqwest 提供的 JSON 解析错误并不总是有帮助
  5. 测试
    • 边缘情况的端点不一定被集成测试所覆盖,因此用户可能需要在实际情况中遇到它们
    • 通过更好的固定值和/或添加宏,测试函数可以简化
    • 这个库应该如何进行单元测试?

问题和拉取请求

欢迎问题和拉取请求,但请保持尊重。如果问题或拉取请求旨在解决特定端点响应解析的问题,或者对文档、人体工程学、测试等方面的改进进行简单说明,那么包含一个端点及其值通常也是一个好主意。

如果只有维护者提问,可以称之为常见问题解答(FAQ)吗?

这个库与 genius_rsgenius_rust 等库有什么不同?

最大的区别在于 genius_rsgenius_rust 都使用了适用于多个端点的大规模通用模型,导致许多字段都是 Option<...>。这可以通过在某些端点中省略字段并在其他端点中包含它来避免。为了实现这一点,megamind 使用了在序列化和反序列化过程中扁平化的高度嵌套结构。这意味着对于您这个 API 消费者来说,需要 unwrap 的次数更少!

catchall 功能是什么,为什么会有这个功能?

catchall 在大多数数据模型上启用了一个额外字段,用于捕获所有缺失的 JSON 字段。这有两个原因

  1. 它通过将未实现的数据汇总到一个地方来提高这个库的开发过程(如果为这些字段未定义,Serde 将简单地丢弃它们)
  2. 它通过允许用户在不等待库更新的情况下访问新的或缺失的字段来提供灵活性。

这也很不幸,只是因为网络 API 本身有点难以驾驭且文档不足。

为什么这个包叫 megamind

天才... 大脑发达的人... Megamind

依赖

~5–20MB
~256K SLoC