如何过滤GET接口返回值?实现管理员与客户端差异化数据返回
解决方案:区分管理员与客户端的作废原因列表接口
针对你的需求,这里提供三种可行的实现方式,你可以根据项目实际情况选择:
1. 通过查询参数控制返回结果
在原接口中新增一个查询参数,用来区分是否需要返回管理员专属的作废原因。这种方式不需要新增接口,仅需修改现有逻辑:
// Get all void reasons, with optional admin-only filter .get("/", async (ctx) => { // 获取查询参数,默认不包含管理员专属原因 const includeAdminOnly = ctx.query.includeAdminOnly === "true"; const voidReasons: TypeAssertion.FriendlyObjectType[] = []; for (const markerVoidReason of await MarkerVoidReasonRepository.instance.getList(VoidReasonTypes.Void)) { // 管理员请求或非"Host System"的原因才加入返回列表 if (includeAdminOnly || markerVoidReason.name !== "Host System") { voidReasons.push(this.mapFrom(markerVoidReason)); } } ctx.response.body = voidReasons; })
调用方式:
- 客户端调用(自动排除"Host System"):
GET /void-reasons - 管理员调用(返回全部原因):
GET /void-reasons?includeAdminOnly=true
2. 新增独立的客户端专用接口
保留原接口给管理员使用,新增一个专门供客户端调用的接口,在这个接口中直接过滤掉"Host System":
// 原管理员接口:返回全部作废原因 .get("/", async (ctx) => { const voidReasons: TypeAssertion.FriendlyObjectType[] = []; for (const markerVoidReason of await MarkerVoidReasonRepository.instance.getList(VoidReasonTypes.Void)) { voidReasons.push(this.mapFrom(markerVoidReason)); } ctx.response.body = voidReasons; }) // 新增客户端专用接口:排除"Host System" .get("/client", async (ctx) => { const voidReasons: TypeAssertion.FriendlyObjectType[] = []; for (const markerVoidReason of await MarkerVoidReasonRepository.instance.getList(VoidReasonTypes.Void)) { if (markerVoidReason.name !== "Host System") { voidReasons.push(this.mapFrom(markerVoidReason)); } } ctx.response.body = voidReasons; })
调用方式:
- 管理员:
GET /void-reasons - 客户端:
GET /void-reasons/client
3. 基于用户权限自动过滤(推荐)
如果后端能识别当前请求的用户身份(比如通过请求头中的token解析用户角色),可以自动根据权限过滤结果,无需前端额外传参:
.get("/", async (ctx) => { // 假设从请求上下文获取当前用户是否为管理员,isAdmin为布尔值 const isAdmin = ctx.state.user?.role === "admin"; const voidReasons: TypeAssertion.FriendlyObjectType[] = []; for (const markerVoidReason of await MarkerVoidReasonRepository.instance.getList(VoidReasonTypes.Void)) { if (isAdmin || markerVoidReason.name !== "Host System") { voidReasons.push(this.mapFrom(markerVoidReason)); } } ctx.response.body = voidReasons; })
这种方式更安全也更优雅,前端无需区分调用方式,后端自动处理权限逻辑。
内容的提问来源于stack exchange,提问作者user21921938
相关产品推荐
相关产品推荐

