Hydra data provider ignores hydra:view pagination links, hardcodes page/itemsPerPage
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 64/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 冷清
- 技术栈
- react, typescript
调研方向
从 src/hydra/dataProvider.ts 中的 convertReactAdminRequestToHydraRequest 以及 602-631 行附近的响应处理开始。跟踪 GET_LIST 分页请求和 hydra:view 链接的处理方式;完成的标准是:初始请求在适当情况下避免强制分页,后续导航遵循 hydra:next 和 hydra:previous,并且游标响应返回 pageInfo 而不是 total。
由索引模型根据 Issue 内容生成。
描述
Description
The Hydra data provider hardcodes page and itemsPerPage query parameters on every GET_LIST request, ignoring the cursor-based pagination links (hydra:next, hydra:previous) returned in hydra:view.
This makes it impossible to use cursor-based (keyset) pagination — a common pattern for APIs that avoid offset-based pagination for performance and consistency reasons.
Current behavior
In convertReactAdminRequestToHydraRequest (dataProvider.ts#L413-L414):
if (page) url.searchParams.set('page', page.toString());
if (perPage) url.searchParams.set('itemsPerPage', perPage.toString());
These params are always appended to the request URL, regardless of what the server's hydra:view links specify.
On the response side (dataProvider.ts#L602-L631), when hydra:totalItems is present, the provider returns { data, total } and never reads hydra:view. The hydra:view / pageInfo path is only reached when totalItems is absent — but even then, subsequent requests still send page=N instead of following the cursor URLs from hydra:next / hydra:previous.
Expected behavior
When a collection response includes hydra:view with hydra:next / hydra:previous links, the data provider should use those URLs for navigation instead of constructing page=N&itemsPerPage=X params. This is how Hydra's PartialCollectionView is designed to work — the server tells the client how to navigate.
Specifically:
- For the first page, the provider should request the collection URL (optionally with
itemsPerPage/pageSizeif the server supports it) - For subsequent pages, the provider should follow
hydra:next/hydra:previousURLs from the response'shydra:view - When
hydra:viewis present withouthydra:last, the provider should returnpageInfo(nottotal) so react-admin uses next/prev navigation
Workaround
We currently bypass base.getList entirely in our data provider wrapper — we fetch the collection URL ourselves, track hydra:next/hydra:previous URLs from responses in a cache, and return pageInfo instead of total:
getList: async (resource, params) => {
const page = params.pagination?.page ?? 1;
const perPage = params.pagination?.perPage ?? 25;
const cached = cursorCache.get(cursorKey(resource, params));
let url;
if (page > 1 && cached?.page < page && cached?.nextUrl) {
url = new URL(cached.nextUrl, window.location.origin);
} else if (page > 1 && cached?.page > page && cached?.previousUrl) {
url = new URL(cached.previousUrl, window.location.origin);
} else {
url = new URL(`/api/${resource}`, window.location.origin);
url.searchParams.set("pageSize", String(perPage));
}
const response = await fetch(url.toString(), {
headers: { Accept: "application/ld+json" },
credentials: "include",
});
const json = await response.json();
const view = json["hydra:view"] ?? null;
cursorCache.set(key, {
nextUrl: view?.["hydra:next"] ?? null,
previousUrl: view?.["hydra:previous"] ?? null,
page,
});
return {
data: json["hydra:member"].map(normalize),
pageInfo: {
hasNextPage: !!view?.["hydra:next"],
hasPreviousPage: !!view?.["hydra:previous"],
},
};
}
This works but defeats the purpose of using the Hydra data provider in the first place.
Versions
@api-platform/admin: 4.2.4react-admin: 5.6.1
- 主要语言
- TypeScript
- 星标
- 516
- 派生
- 134
- PR 合并指标
- 30 天内没有已合并 PR
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
api-platform/admin 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 65/100
api-platform/admin#616 · 1 条评论 ·
-
难度 4/5 3-5 天 新手友好度 50/100
api-platform/admin#659 · 1 个 reaction ·
-
难度 3/5 1-2 天 新手友好度 35/100
api-platform/admin#631 · 6 条评论 ·
-
难度 4/5 3-5 天 新手友好度 35/100
api-platform/admin#626 · 1 条评论 · 1 个 reaction ·
-
难度 4/5 3-5 天 新手友好度 35/100
api-platform/admin#615 · 4 条评论 · 2 个 reaction ·
查看 api-platform/admin 的全部 Issue
相似的 Issue
-
blocklist removal
难度 2/5 1-3 小时 新手友好度 65/100
MetaMask/eth-phishing-detect#296544 ·
-
难度 2/5 1-3 小时 新手友好度 70/100
pastelsky/bundlephobia#1122 ·
-
难度 2/5 1-3 小时 新手友好度 70/100
-
category/development priority/P2 scope/file-operations scope/testing type/enhancement
难度 2/5 1-3 小时 新手友好度 75/100
-
难度 2/5 1-3 小时 新手友好度 75/100