You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:55:24