Glance custom-api 如何用 subrequests 与模板内 newRequest 链式调用多个 API?

发布时间:2026/11/5 11:01:43

Glance custom-api 如何用 subrequests 与模板内 newRequest 链式调用多个 API? Glance custom-api 如何用 subrequests 与模板内 newRequest 链式调用多个 API【免费下载链接】glanceA self-hosted dashboard that puts all your feeds in one place项目地址: https://gitcode.com/GitHub_Trending/gla/glance当你想让一个 Glancecustom-api组件同时展示多个 JSON API 的数据时官方文档给出了两条路径区别在于两次调用之间有没有依赖关系subrequests在 YAML 里声明附加请求它们与主请求并发执行结果通过.Subrequest key在模板中读取。适用于彼此独立、只需要汇总展示的数据源。newRequest/getResponse在模板内部发起 HTTP 请求第一次调用的返回字段可以拼进第二次调用的 URL 或参数。适用于“第一次调用拿到 ID第二次用这个 ID 拉详情”这类顺序依赖的场景。两条路径的用法分别记录在 docs/custom-api.md 的示例部分和 docs/configuration.md 的subrequests属性小节中。先判断该用哪条路径情况方案关键点多个 API 互不依赖汇总到一个组件subrequests模板里用.Subrequest key访问第二个请求的 URL/参数取决于第一个请求的响应模板内newRequest \| getResponsegetResponse的返回值可用.JSON读取字段URL 需要动态参数如“最近 24 小时”的时间戳省略url请求完全放在模板内newRequestwithParameter由于 subrequests 与主请求是并发发起的某个 subrequest 无法使用另一个 subrequest 的结果存在依赖关系时只能走模板内请求这条路。用 subrequests 并行拉取多个独立 APIsubrequests是一个 mapkey 是模板里要用的名字value 是一个完整的请求定义。官方文档中的示例- type: custom-api cache: 2h subrequests: another-one: url: https://uselessfacts.jsph.pl/api/v2/facts/random title: Random Fact url: https://uselessfacts.jsph.pl/api/v2/facts/random template: | p classsize-h4 color-paragraph{{ .JSON.String text }}/p p classsize-h4 color-paragraph margin-top-15{{ (.Subrequest another-one).JSON.String text }}/p这里主请求和another-one各拉一次随机事实模板里分别渲染。几个要点subrequest 支持与主请求相同的几乎所有属性headers、parameters、method等唯一不能再嵌套的就是subrequests本身。(.Subrequest key)写起来比较啰嗦可以先赋给变量template: | {{ $anotherOne : .Subrequest another-one }} p{{ $anotherOne.JSON.String text }}/psubrequest 的.Response和主请求用法一致可以检查状态码template: | {{ $anotherOne : .Subrequest another-one }} p{{ $anotherOne.Response.StatusCode }}/p如果模板里写了一个没有定义的 key渲染会直接报错报错信息形如subrequest with key xxx has not been defined见 widget-custom-api.go看到这个提示先检查subrequests下的 key 和模板里.Subrequest ...的拼写是否一致。运行层面的行为源码 widget-custom-api.go只要存在 subrequests主请求与所有 subrequest 会并发执行其中一个失败时其余请求会被取消整个组件本次更新失败不会渲染出部分数据。用 newRequest 在模板内发起依赖上一次结果的请求这是 docs/custom-api.md 给出的链式调用示例主请求先拿到id再把这个 ID 拼进第二个请求的 URL- type: custom-api url: https://api.example.com/get-id-of-something template: | {{ $theID : .JSON.String id }} {{ $something : newRequest (concat https://api.example.com/something/ $theID) | withParameter key value | withHeader Authorization Bearer token | getResponse }} {{ $something.JSON.String title }}链式调用中每个环节的职责newRequest创建一个请求对象接收 URL。除文档示例中的concat拼 URL 外源码里它的第一个参数也支持 Go 的格式串写法后面的参数会经fmt.Sprintf代入见 widget-custom-api.go所以newRequest https://api.example.com/something/%s $theID这种写法同样可行。withParameter、withHeader可选给请求追加 query 参数和请求头。getResponse真正执行请求返回一个可以用.JSON和.Response读取的对象。因为getResponse的返回值和主请求、subrequest 一样都提供.JSON所以同样的模式可以连续套用——第二次请求的结果还能作为第三次请求的输入依次发起即可。getResponse的执行细节值得注意源码 widget-custom-api.go如果这次请求本身出错网络失败、响应不是合法 JSON 等它不会中断模板而是返回一个状态不正常的响应对象并把错误信息放在.Response.Status里同时把Could not fetch response within custom API template记入服务端日志。也就是说模板里的状态码检查分支就是为这种情况准备的。省略 url把请求完全放在模板里当目标 URL 需要动态参数时可以不在 YAML 里写url整个请求都从模板内发出。文档示例是拉取最近 24 小时的事件- type: custom-api title: Events from the last 24h template: | {{ $events : newRequest https://api.example.com/events | withParameter after (offsetNow -24h | formatTime rfc3339) | getResponse }} {{ if eq $events.Response.StatusCode 200 }} {{ range $events.JSON.Array events }} div{{ .String title }}/div div {{ .String date | parseTime rfc3339 | toRelativeTime }}/div {{ end }} {{ else }} pFailed to fetch data: {{ $events.Response.Status }}/p {{ end }}这里有几点约束文档明确提醒走这条路径时必须手动检查状态码上例的{{ if eq $events.Response.StatusCode 200 }}分支就是检查方式失败分支里通过{{ $events.Response.Status }}展示错误。offsetNow的 offset 参数必须形如3h、-1h或2h30m10sformatTime的 layout 参数与parseTime相同可直接用rfc3339。省略url时主请求本身没有响应数据源码中 URL 为空会返回空的 JSON 结果见 widget-custom-api.go所以模板里不要再去读主上下文.JSON的字段一切数据都来自getResponse的返回值。验证配置是否生效保存glance.yml后 Glance 会自动重新加载配置无需重启。若新配置有错控制台会输出错误Glance 继续用旧配置运行把错误修掉后新配置才会加载见 docs/configuration.md。渲染结果落在浏览器里对应组件的位置上链式调用成功时应看到第二个 API 的数据失败时会看到你模板里写的失败分支文案如Failed to fetch data: ...。需要排查但又不想反复打真实 API 时源码中还有一个mock-response字段CustomAPIRequest上的yaml:mock-response见 widget-custom-api.go设置后该请求不发起真实网络调用直接用你给的 JSON 字符串作为响应状态码视为 200。注意这个字段没有出现在文档的属性表中是从源码确认的。限制subrequests 之间是并发的彼此无法传递数据有顺序依赖一律用模板内newRequest。subrequest 不能嵌套subrequests。模板内请求没有默认的状态码兜底检查逻辑要自己写请求失败时组件不会崩但你会在失败分支里看到结果服务端日志里同时留有Could not fetch response within custom API template记录可供对照。配置里如需填 token 一类敏感值headers 的取值支持${ENV_VAR}环境变量语法见 docs/configuration.md避免把密钥明文写进glance.yml。【免费下载链接】glanceA self-hosted dashboard that puts all your feeds in one place项目地址: https://gitcode.com/GitHub_Trending/gla/glance创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/28 18:44:48

绪论AI检测率100%?从检测原理到改写实操彻底降AIGC

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 14:38:31

爬虫工程化:Schema Versioning 与字段平滑演化的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 10:43:56

工业测温方案解析:ADS122U04与STM32F042K6的UART高精度RTD采集设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 10:43:56

STM32L031+ADS122U04:UART接口24位ADC实现PT100高精度温度采集

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 10:43:55

基于ADS122U04与MK24的HVAC高精度温度采集系统设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 10:38:55

Univer开源Web Office引擎:Canvas渲染与协同编辑实战解析

第一次看到Univer这个项目名字的时候,我下意识以为是哪个海外团队用“University”做的教育类产品。直到我翻完它的仓库和在线Demo,才发现自己差点错过一个好东西——这是一个把“在线电子表格、文档、幻灯片”全部做成开源引擎的Web Office项目&#xf…

2026/11/5 10:38:55

Foxmail数字签名与加密配置全指南:S/MIME证书实战落地

1. 邮件签名与加密不是“加个水印”或“点个锁图标”那么简单很多人第一次在Foxmail里找“签名”功能,点开设置就以为万事大吉——填上姓名、电话、公司logo,保存退出,邮件发出去带个固定落款,就觉得“搞定”。等真遇到客户问“你…

2026/11/5 10:38:55

LVS负载均衡优化:FWM标记与持久化服务实践

1. 为什么需要优化LVS调度?在企业级负载均衡场景中,Linux Virtual Server(LVS)作为四层负载均衡的经典解决方案,其性能表现直接影响着整个业务系统的稳定性。但在实际生产环境中,我们常常会遇到两个典型问题…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑