6个版本
0.19.1 | 2023年11月23日 |
---|---|
0.19.0 | 2023年11月16日 |
0.18.5 | 2023年6月7日 |
0.18.3 | 2023年4月19日 |
0.18.2 | 2023年2月17日 |
#82 在 HTTP客户端
174 每月下载量
565KB
12K SLoC
Octocrab:一个现代、可扩展的GitHub API客户端。
Octocrab是一个第三方GitHub API客户端,允许您轻松地在Rust中构建自己的GitHub集成或机器人。Octocrab
提供了两组主要的API用于与GitHub通信,一个高级强类型语义API,以及一个低级HTTP API用于扩展行为。
添加Octocrab
在您的终端中运行此命令以添加最新版本的Octocrab
。
$ cargo add octocrab
语义API
语义API提供了GitHub API的强类型支持,一组映射到GitHub类型的models
,以及auth
函数,这些函数对GitHub应用很有用。目前,以下模块自版本0.17
起可用。
actions
GitHub Actions。apps
GitHub Apps。current
当前用户信息。gitignore
Gitignore模板。graphql
GraphQL。issues
问题及相关项目,例如评论、标签等。licenses
许可证元数据。markdown
使用GitHub渲染Markdown。orgs
GitHub组织。pulls
Pull请求。releases
发布版本。repos
仓库。search
GitHub的搜索API。teams
团队。
获取Pull请求
// Get pull request #5 from `XAMPPRocky/octocrab`.
let issue = octocrab::instance().pulls("XAMPPRocky", "octocrab").get(5).await?;
所有具有多个可选参数的方法都构建为Builder
结构体,允许您轻松指定参数。
列出问题
let octocrab = octocrab::instance();
// Returns the first page of all issues.
let mut page = octocrab
.issues("XAMPPRocky", "octocrab")
.list()
// Optional Parameters
.creator("XAMPPRocky")
.state(params::State::All)
.per_page(50)
.send()
.await?;
// Go through every page of issues. Warning: There's no rate limiting so
// be careful.
loop {
for issue in &page {
println!("{}", issue.title);
}
page = match octocrab
.get_page::<models::issues::Issue>(&page.next)
.await?
{
Some(next_page) => next_page,
None => break,
}
}
HTTP API
当前类型化API尚未涵盖GitHub API的所有内容,即使覆盖了,GitHub也在积极开发中,因此这个库可能始终在某些时候落后于GitHub。但这并不意味着为了使用这些功能,您必须分叉或用您自己的解决方案替换octocrab
。
相反,octocrab
公开了一套HTTP方法,允许您轻松扩展Octocrab
的现有行为。使用这些HTTP方法允许您继续使用相同的身份验证和配置,同时控制请求和响应。每种HTTP方法都有一个方法,如get
、post
、patch
、put
、delete
,所有这些都接受一个相对路由和一个可选的正文。
let user: octocrab::models::User = octocrab::instance()
.get("/user", None::<&()>)
.await?;
每个HTTP方法都期望一个正文,使用基本URL格式化URL,如果GitHub没有返回成功状态,则报错。但在处理GitHub API时,这并不总是期望的,有时您需要检查响应状态或头信息。因此,存在配套方法_get
、_post
等,这些方法不对请求进行任何额外的预处理或后处理。
let octocrab = octocrab::instance();
let response = octocrab
._get("https://api.github.com/organizations", None::<&()>)
.await?;
// You can also use `Octocrab::absolute_url` if you want to still to go to
// the same base.
let response = octocrab
._get(octocrab.absolute_url("/organizations")?, None::<&()>)
.await?;
您可以使用这些HTTP方法轻松创建自己的扩展,用于扩展Octocrab
的类型化API。(需要async_trait
)。
use octocrab::{Octocrab, Page, Result, models};
#[async_trait::async_trait]
trait OrganisationExt {
async fn list_every_organisation(&self) -> Result<Page<models::Organization>>;
}
#[async_trait::async_trait]
impl OrganisationExt for Octocrab {
async fn list_every_organisation(&self) -> Result<Page<models::Organization>> {
self.get("/organizations", None::<&()>).await
}
}
您还可以使用serde
轻松访问当前模型中不可用的新属性。
#[derive(Deserialize)]
struct RepositoryWithVisibility {
#[serde(flatten)]
inner: octocrab::models::Repository,
visibility: String,
}
let my_repo = octocrab::instance()
.get::<RepositoryWithVisibility>("https://api.github.com/repos/XAMPPRocky/octocrab", None::<&()>)
.await?;
静态API
Octocrab
还提供了一个API的静态引用计数版本,允许您轻松将其集成到现有系统中,而无需担心必须集成和传递客户端。
// Initialises the static instance with your configuration and returns an
// instance of the client.
octocrab::initialise(octocrab::Octocrab::builder());
// Gets a instance of `Octocrab` from the static API. If you call this
// without first calling `octocrab::initialise` a default client will be
// initialised and returned instead.
let octocrab = octocrab::instance();
依赖项
~15–31MB
~547K SLoC