本文介绍了如何使用 SHYFT 的 GraphQL API 查询 FamousFox Raffle program 的数据。
在之前的文章中,我们向你介绍了 Shyft 的 GraphQL API,它们正在彻底改变你与 Solana 程序账户数据交互的方式。这些 API 提供了一种无缝的方法来查询任何程序的账户数据,为传统的 getProgramAccounts() 方法提供了一个 强大的替代方案。如果你错过了那篇文章,可以通过点击这个链接重新阅读。
在今天的文章中,我们将指导你使用 Shyft 的 GraphQL API 来查询来自 FFF Raffles 的数据,演示各种功能的实现:
听起来是不是很有趣?让我们深入了解如何充分利用这些功能。
首先,我们需要准备一些东西。
x-api-key
是一个身份验证参数,它使你可以访问 Shyft API。你可以从 Shyft 网站获取 你自己的 API 密钥。只需在此处使用你的电子邮件 ID 注册,即可免费获得。如果你已经拥有 Shyft API 密钥,请跳过此步骤。
我们在这个项目中使用的是 Next JS,但这可以在任何应用程序开发环境中完成。有关 如何使用 Next.js 1 设置 GraphQL 的更多信息,请参考此链接 3。
你可以从此 repo 克隆本文的完整源代码。
使用 Shyft GraphQL API,查询所有带有分页支持的 raffle 易如反掌。 查询结构非常简单:
query FFF_Raffle_Raffle($limit: Int, $offset: Int) {
FFF_Raffle_Raffle(limit: $limit, offset: $offset) {
claimedPrizes
cm
creator
endTimestamp
entrants
fox
holderOnly
lamports
limit
mint
numberSold
prize
pubkey
randomness
startTimestamp
ticketPrice
totalPrizes
totalTickets
winner
winnerCount
}
}
为了实现分页,我们可以通过指定 limit
和 offset
字段来自定义查询。limit
参数确定返回的行数(默认为 1000),而 offset
参数设置结果集的起始点。你的代码片段可能如下所示:
const ITEM_PER_PAGE = 50;
const query = gql`
query FFF_Raffle_Raffle($limit: Int, $offset: Int) {
FFF_Raffle_Raffle(limit: $limit, offset: $offset) {
claimedPrizes
cm
creator
...
}
}
`;
const variables = {
limit: ITEM_PER_PAGE,
offset: 0,
}
const { loading, data, fetchMore } = useQuery(query, {
variables,
});
const raffles = (data?.FFF_Raffle_Raffle ?? []) as RafffleItemType[];
通过结合 limit
和 offset
参数,你可以轻松地合并分页 - 这是传统 getProgramAccounts()
方法不支持的功能。
Shyft GraphQL API 使我们能够根据任何期望的字段无缝地对返回的结果进行排序。 排序过程通过指定我们要排序的字段以及我们希望排序的方向(asc 或 desc)来执行。 让我们相应地增强查询:
query FFF_Raffle_Raffle(
$limit: Int
$offset: Int
$orderBy: [FFF_Raffle_Raffle_order_by!]
) {
FFF_Raffle_Raffle(limit: $limit, offset: $offset, order_by: $orderBy) {
claimedPrizes
cm
creator
...
}
}
现在,让我们将其转化为代码:
const ITEM_PER_PAGE = 50;
const query = gql`
query FFF_Raffle_Raffle(
$limit: Int
$offset: Int
$orderBy: [FFF_Raffle_Raffle_order_by!]
) {
FFF_Raffle_Raffle(limit: $limit, offset: $offset, order_by: $orderBy) {
claimedPrizes
cm
creator
...
}
}
`;
const sortByField = "startTimestamp";
const sortByDirection = "desc";
const variables = {
orderBy: [\
{\
[sortByField]: sortByDirection,\
},\
],
limit: ITEM_PER_PAGE,
offset: 0,
}
const { loading, data, fetchMore } = useQuery(query, {
variables,
});
const raffles = (data?.FFF_Raffle_Raffle ?? []) as RafffleItemType[];
在上面的例子中,我们根据 startTimestamp
字段按降序(最新到最旧)对结果进行排序。 通过更新 sortByField
和 sortByDirection
的值,你可以轻松自定义 raffle 列表的排序 - 无论是按价格(从高到低)、价格(从低到高)还是你喜欢的任何顺序。
如果你想要查询由特定创建者创建的所有 raffle,Shyft GraphQL API 不仅使之成为可能,而且还很简单。 这些 API 提供了基于任何期望字段过滤结果的功能。 此外,你可以灵活地从各种比较表达式中进行选择,例如 _eq
(等于)和 _like
(类似于 SQL 的 LIKE 运算符)。
现在,让我们增强查询:
query FFF_Raffle_Raffle(
$limit: Int
$offset: Int
$orderBy: [FFF_Raffle_Raffle_order_by!]
$where: FFF_Raffle_Raffle_bool_exp
) {
FFF_Raffle_Raffle(
limit: $limit
offset: $offset
order_by: $orderBy
where: $where
) {
claimedPrizes
cm
creator
...
}
}
将其转化为代码:
const ITEM_PER_PAGE = 50;
const query = gql`
query FFF_Raffle_Raffle(
$limit: Int
$offset: Int
$orderBy: [FFF_Raffle_Raffle_order_by!]
$where: FFF_Raffle_Raffle_bool_exp
) {
FFF_Raffle_Raffle(
limit: $limit
offset: $offset
order_by: $orderBy
where: $where
) {
claimedPrizes
cm
creator
...
}
}
`;
const creator = "desc";
const sortByField = "startTimestamp";
const sortByDirection = "2NN5VR5UVtRY7mAM18cnxcJ8qXwqWFxLrF2J5bJXBJoz";
const variables = {
where: {
creator: {
_eq: creator
}
}
orderBy: [\
{\
[sortByField]: sortByDirection,\
},\
],
limit: ITEM_PER_PAGE,
offset: 0,
}
const { loading, data, fetchMore } = useQuery(query, {
variables,
});
const raffles = (data?.FFF_Raffle_Raffle ?? []) as RafffleItemType[];
在这个例子中,我们查询由特定创建者创建的所有 raffle。 filter
参数与 _eq
表达式结合使用,使我们能够精确地缩小结果范围。 这种程度的特异性确保你检索到正在寻找的精确数据。
设置好一切并运行应用程序后,我们会收到如下面视频所示的结果。
因此,我们刚刚向你介绍了使用 Shyft GraphQL API 与 FFF Raffles 交互的来龙去脉。 借助 Shyft GraphQL API,查询所有带有分页支持的 raffle、按任何字段对 raffle 进行排序以及按创建者和 mint token 过滤 raffle 变得轻松实现。 我们希望通过本文,你能够获得将 Shyft GraphQL API 无缝集成到你的 Dapp 应用程序中的知识和信心,使你能够制作真正引人入胜和创新的产品。
我们真诚地希望你喜欢阅读这篇博文! 如果你有任何疑问或想法,请随时访问我们的 Discord 社区。
非常感谢你抽出时间阅读!
- 原文链接: blogs.shyft.to/how-to-qu...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!