#json-response #com #wrapper #api-client #xml #fetch #boardgamegeek

rbgg

这是一个简单的 Rust 库,它将使用 boardgamegeek.com 上定义的 API 获取 BGG 数据(https://boardgamegeek.com/wiki/page/BGG_XML_API)。这将接收输入查询并返回 JSON 响应。

2 个版本

0.1.1 2023 年 12 月 5 日
0.1.0 2023 年 12 月 5 日

#16#json-response

GPL-2.0-or-later

52KB
1K SLoC

rbgg

这是一个库,允许您方便地使用 boardgamegeek.com 的 API。这是一个相当薄的 API 包装器,因此,通过 BGG 网站上的文档和这里的文档,您应该能够快速开始。

API 版本 1: https://boardgamegeek.com/wiki/page/BGG_XML_API
API 版本 2: https://boardgamegeek.com/wiki/page/BGG_XML_API2

该库的基本功能相当简单。您创建一个与 API 匹配的调用,例如在创建客户端后执行 search,然后您将获得一个包含转换后的 XML 的 serde_json::Value 响应。

支持阻塞和异步

在此库中需要注意的其他事项是,默认情况下支持异步调用,但可以通过在方法名末尾附加 "_b" 来支持阻塞调用。

例如,如果您想调用 search() 方法,以下是您会这样做的方式。

use rbgg::bgg2::*;

// There's also a Client2::new() that allows you to change root url and
// API path, but unless you have some specfic use case, you want to use
// the defaults.
let client = Client2::new_from_defaults();
// Calling the search function async. I'll note that all results, both async
// and sync, will be `Result<Value>`
let result = client.search("bruges", &vec![Search::BoardGame], None).await?;

// Similarly, calling it using a blocking call
let result = client.search_b("bruges", &vec![Search::BoardGame], None)?;

API v2

虽然 API v1 跟踪 BGG 网站上的文档,技术上 API v2 也是这样,但有一些额外的便捷方法。

例如,thing API 允许您指定 ID 和一个或多个要获取的“事物”。虽然您可以使用该原始 API,但每个“事物”都有自己的直接调用。以下是一些示例,首先使用直接事物 API,然后使用 boardgame() 便捷方法。

use rbgg::{bgg2::*, utils::Params};

let client = Client2::new_from_defaults();
// You can set any of the parameters for the call using the `Params` in the
// utils lib.
let params = Params::from([
  ("comments".into(), "1".into()),
  ("stats".into(), "1".into()),
]);
// You can retrieve more than 1 item at a time
let game_ids = vec![136888, 133473];
let ttypes = vec![Thing::BoardGame];

// We'll use the blocking call in this example
let res = client.thing_b(&game_ids, &ttypes, Some(params));

// Alternatively, you can implicitly just use the "thing" type of boardgame.
// Here is the same call with the convenience function.
let res = client.boardgame_b(&game_ids, Some(params));

还有类似的方法可以用于所有 家族项目

除此之外,您基本上只需遵循 BGG 网站上的文档说明,因为这就是库所实现的。祝您游戏愉快!

需要注意的注意事项

  • 该库不执行自动分页收集等操作。因此,如果结果超过1页,处理方式由您决定。好处是您可以轻松访问这些数据。
  • 如果响应本身存在错误,您需要在JSON响应中处理这些错误。它看起来可能像这样
{
  "error": {
    "message": "Rate limit exceeded."
  }
}

依赖项

~7-19MB
~286K SLoC