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

发布时间:2026/9/10 5:46:32

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/9/10 5:46:32

绪论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/9/10 5:46:32

爬虫工程化: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/9/10 6:41:38

OpenClaw+IoT:打造真正懂你的全屋智能实战

做全屋智能这行时间长了就会发现,客户对“智能”的期待,和设备厂商对“智能”的定义,完全是两回事。大部分厂商交付的是“能控制的灯”,而客户真正想要的是一个“不用自己动手的家”。这两年我陆续落地了12个全屋智能项目&#xf…

2026/9/10 6:41:38

AI招聘的演进:从单点提效到业务重构的关键路径

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

2026/9/10 6:41:37

MySQL库操作指南:建库、字符集、权限与备份全解析

1. 库操作到底在操作什么刚接触MySQL的时候,很多人第一件事就是装环境、配变量、打开命令行敲几句SQL。折腾完mysql -uroot -p能进去了,接下来自然就会问一句:然后呢?然后就是建库、建表、塞数据。这里面的“建库”就是我今天想聊…

2026/9/10 6:41:37

SSM电商实战:从分层架构到订单事务与库存扣减

简介:SSM项目鲜花销售管理系统.zip 是一套基于 SpringSpringMVCMyBatis 框架的完整 Java Web 实战项目,适合正在学习 SSM 整合、MySQL 数据库及前端 LayUI 的中高级开发者。资源共收录 637 个文件,压缩后约 22.68MB,包含 105 个 J…

2026/9/10 6:36:37

本地大模型推理CLI工具真相:llama.cpp、Ollama与LMDEPLOY实操指南

1. “magnitude”不是命令行工具,而是被误传的模型推理服务代号最近在多个技术社区和开发者群聊里,频繁看到有人搜索“magnitude CLI”“magnitude inference server”“magnitude local models”,甚至把“magnitude”和“codex cli”“claud…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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