5 个版本
0.2.2 | 2019 年 7 月 23 日 |
---|---|
0.2.1 | 2019 年 6 月 27 日 |
0.1.2 | 2019 年 5 月 15 日 |
0.1.0 | 2019 年 3 月 10 日 |
在 科学 中排名第 301
每月下载 32 次
用于 论文
170KB
3K SLoC
Crossref-rs - Crossref-API 的 Rust 客户端
此客户端受 sckott/habanero 启发。
Crossref
- Crossref 搜索 API。The Crossref
crate 提供与 Crossref API 路由匹配的方法
works
-/works
路由members
-/members
路由prefixes
-/prefixes
路由funders
-/funders
路由journals
-/journals
路由types
-/types
路由agency
-/works/{doi}/agency
获取 DOI 颁发机构
使用方法
创建 Crossref
客户端
let client = Crossref::builder().build()?;
let client = Crossref::builder()
.token("token")
.build()?;
鼓励使用 礼貌池
要进入 Crossref 的礼貌池,请包含一个电子邮件地址
let client = Crossref::builder()
.polite("[email protected]")
.token("your token")
.build()?;
构造查询
并非所有组件都支持查询,并且每个支持查询的路由都有可用的自定义参数。对于支持查询的资源组件,存在一个 Query 结构:WorksQuery
、MembersQuery
、FundersQuery
。The WorksQuery
还与其他的不同,因为它支持 使用游标进行深度分页 和 字段查询。
否则,对于所有资源组件创建查询的方式都相同
let query = WorksQuery::new("Machine Learning")
// field queries supported for `Works`
.field_query(FieldQuery::author("Some Author"))
// filters are specific for each resource component
.filter(WorksFilter::HasOrcid)
.order(Order::Asc)
.sort(Sort::Score);
获取记录
请参阅 此表 以获取主要组件的详细概述。
有 3 个不同的目标
- 独立资源组件:
/works
、/members
、funders
、prefixes
、types
,返回对应项的列表,并可使用查询进行指定。 - 具有标识符的资源组件:
/works/{doi}?<query>
、/members/{member_id}?<query>
等,如果找到则返回单个项。 - 与
works
路由结合使用:工作组件可以附加到其他资源上,例如:/members/{member_id}/works?<query>
等,返回匹配的Work
项的列表,作为WorkList
。
这类似于资源组件的枚举,例如对于Members
。
pub enum Members {
/// target a specific member at `/members/{id}`
Identifier(String),
/// target all members that match the query at `/members?query...`
Query(MembersQuery),
/// target a `Work` for a specific member at `/members/{id}/works?query..`
Works(WorksIdentQuery),
}
示例
客户端支持所有选项
通过DOI或ID查询单个项
所有资源组件都有类似的方法
let work = client.work("10.1037/0003-066X.59.1.29")?;
let agency = client.work_agency("10.1037/0003-066X.59.1.29")?;
let funder = client.funder("funder_id")?;
let member = client.member("member_id")?;
查询
let query = WorksQuery::new("Machine Learning");
// one page of the matching results
let works = client.works(query)?;
或者直接插入一个自由形式的查询词
let works = client.works("Machine Learning")?;
与Works
路由结合
对于除Works
之外的所有资源组件,都存在方法可以附加一个具有ID选项的WorksQuery
,例如/members/{member_id}/works?<query>?
。
use crossref::*;
fn run() -> Result<()> {
let client = Crossref::builder().build()?;
let works = client.member_works(WorksQuery::new("machine learning")
.sort(Sort::Score).into_ident("member_id"))?;
Ok(())
}
这将与通过提供组合类型使用Crossref::works
方法相同。
use crossref::*;
fn run() -> Result<()> {
let client = Crossref::builder().build()?;
let works = client.works(WorksQuery::new("machine learning")
.sort(Sort::Score)
.into_combined_query::<Members>("member_id"))?;
Ok(())
}
**Works
的深度分页** 深度分页结果 支持所有查询,返回一个Work
、WorkList
的列表。这个函数返回一个新迭代器,遍历Work
页面,由crossref作为大量项以WorkList
的形式返回。通常单个WorkList
包含20个项。
示例
遍历与搜索词Machine Learning
链接的所有Works
。
use crossref::{Crossref, WorksQuery, Work};
fn run() -> Result<(), crossref::Error> {
let client = Crossref::builder().build()?;
let all_works: Vec<Work> = client.deep_page(WorksQuery::new("Machine Learning")).flat_map(|x|x.items).collect();
Ok(())
}
可以简化为
use crossref::{Crossref, WorksQuery, Work};
fn run() -> Result<(), crossref::Error> {
let client = Crossref::builder().build()?;
let all_works: Vec<Work> = client.deep_page("Machine Learning").into_work_iter().collect();
Ok(())
}
通过组合查询遍历具有id funder id
的资助者的所有页面(WorkList
)。单个WorkList
通常包含20个Work
项。
use crossref::{Crossref, Funders, WorksQuery, Work, WorkList};
fn run() -> Result<(), crossref::Error> {
let client = Crossref::builder().build()?;
let all_funder_work_list: Vec<WorkList> = client.deep_page(WorksQuery::default()
.into_combined_query::<Funders>("funder id")
)
.collect();
Ok(())
}
直接遍历特定资助者的所有Work
项。
use crossref::{Crossref, Funders, WorksQuery, Work, WorkList};
fn run() -> Result<(), crossref::Error> {
let client = Crossref::builder().build()?;
let all_works: Vec<Work> = client.deep_page(WorksQuery::default()
.into_combined_query::<Funders>("funder id"))
.into_work_iter()
.collect();
Ok(())
}
命令行应用程序
安装
cargo install crossref --features cli
使用方法
顶级子命令
USAGE:
crossref <SUBCOMMAND>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
SUBCOMMANDS:
funders Query crossref funders
help Prints this message or the help of the given subcommand(s)
journals Query crossref journals
members Query crossref members
prefixes Query crossref prefixes
types Query crossref types
works Query crossref works
组件子命令的附加选项(查询、排序、排序和限制仅支持子命令 <works|funders|members>,并且被现有的--id
选项覆盖)
USAGE:
crossref works [FLAGS] [OPTIONS] [SUBCOMMAND]
FLAGS:
-a, --append if the output file already exists, append instead of overwriting the file
-d, --deep-page Enable deep paging. If a limit is set, then the limit takes priority.
-h, --help Prints help information
-s, --silent do not print anything
-V, --version Prints version information
OPTIONS:
-i, --id <id> The id of component.
-l, --limit <limit> limit the amount of results
--offset <offset> Sets an offset where crossref begins to retrieve items.
--order <order> How to order the results: asc or desc
-o <output> output path where the results shall be stored
--polite <polite> The email to use to get into crossref's polite pool
-q, --query <query_terms>... The free form terms for the query
--sample <sample> Request randoms Elements. Overrides all other options.
--sort <sort> How to sort the results, such as updated, indexed, published, issued
--token <token> The token to use for the crossref client
--user-agent <user_agent> The user agent to use for the crossref client
示例
通过DOI检索特定作品
crossref works --id "10.1037/0003-066X.59.1.29"
将结果保存为json
crossref works --id "10.1037/0003-066X.59.1.29" -o output.json
通过它们的ID检索任何其他组件
crossref <works|journals|members|prefixes|types> --id "10.1037/0003-066X.59.1.29" -o output.json
某些组件支持额外的过滤
crossref <works|funders|members> --query "A search term such as `Machine learning` for works" --limit 10 --offset 200 --order asc
获取特定组件的Works
,例如具有id 98
的成员。
crossref works member 98
<prefix|funder|prefix|type
也以相同的方式支持。
默认情况下,深度分页是禁用的,因此Works
的结果最多为20(单个crossref页面)。通过启用--deep-page
标志,将收集所有可用结果。
要进入礼貌池,请使用--polite "[email protected]"
将您的电子邮件作为请求头提供。
许可
根据以下任一项许可
- Apache许可证,版本2.0,(LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
依赖项
~18–28MB
~492K SLoC