ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

OctoPrint JavaScript 客户端库 Job 模块实战指南:查询与操控打印任务

2026/9/25 5:25:15 拓冰建站 浏览量
OctoPrint JavaScript 客户端库 Job 模块实战指南:查询与操控打印任务 物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载OctoPrint 内置的 JavaScript 客户端库JS Client Library为前端页面与插件提供了访问 OctoPrint 全部 REST API 的统一接口其中OctoPrint.job模块专门负责查询当前打印任务状态并下发启动、取消、重启、暂停与恢复等控制指令。本指南以 docs/jsclientlib/job.rst 的 API 文档为骨架结合客户端源码 job.js、后端端点 job.py 与响应数据模型 job.py 深入讲解读完你将能熟练地在自己的页面或插件中查询任务进度、安全地控制打印任务生命周期并理解每个调用背后的 HTTP 请求与前置条件。客户端库与 Job 组件概览OctoPrint 的 JavaScript 客户端库采用基础组件 功能组件的架构所有组件都依赖base组件通过OctoPrintClient.registerComponent(job, OctoPrintJobClient)注册为OctoPrint全局实例上的job属性见 job.js。整个库被打包为/static/webassets/packed_client.js也可按需引入单个组件文件/static/js/app/client/component.js使用前必须确保 jQuery 与 lodash 已加载分别作为$与_使用详见 docs/jsclientlib/index.rst。OctoPrint.job模块共提供 7 个方法全部返回 jQuery Promise可链式调用.done()、.fail()、.always()等方法作用对应 HTTP 请求OctoPrint.job.get(opts)查询当前打印任务信息GET /api/jobOctoPrint.job.start(opts)开始打印当前选中的文件POST /api/job命令startOctoPrint.job.cancel(opts)取消当前打印任务POST /api/job命令cancelOctoPrint.job.restart(opts)从开头重新开始当前任务POST /api/job命令restartOctoPrint.job.pause(opts)暂停当前任务POST /api/job命令pauseaction: pauseOctoPrint.job.resume(opts)恢复当前任务POST /api/job命令pauseaction: resumeOctoPrint.job.togglePause(opts)在暂停/运行间切换POST /api/job命令pauseaction: toggle查询当前任务OctoPrint.job.get(opts)OctoPrint.job.get() .done(function(response) { console.log(当前状态:, response.state); console.log(任务文件:, response.job.file.name); console.log(打印进度:, response.progress.completion %); });该方法对应GET /api/job端点job.py需要STATUS权限。后端通过printer.get_current_data()组装响应最终返回三大部分job当前任务的文件信息与预估数据对应 schema 中的ApiJobInfo。其中file为ApiJobFile字段包括name内部文件名、path文件路径、display显示名、origin存储位置如local、size字节数、date最后修改时间戳、upload是否正在上传中此外还有estimatedPrintTime预估打印秒数与filament各工具头的耗材长度/体积映射。progress进度信息对应ApiProgressInfo包含completion完成百分比、filepos当前文件字节位置、printTime已打印秒数、printTimeLeft预计剩余秒数以及printTimeLeftOrigin估算来源取值包括linear、analysis、estimate、average、mixed-analysis、mixed-average、printer。state当前打印状态文本例如Printing、Paused、Operational若出错还包含error字段。一个典型的GET /api/job响应示例来自 docs/api/job.rst{ job: { file: { name: whistle_v2.gcode, origin: local, size: 1468987, date: 1378847754 }, estimatedPrintTime: 8811, filament: { tool0: { length: 810, volume: 5.36 } }, user: someone }, progress: { completion: 0.2298468264184775, filepos: 337942, printTime: 276, printTimeLeft: 912, printTimeLeftOrigin: linear }, state: Printing }注意2.0.0 版本后 API 引入了版本化机制见 docs/api/job.rst 开头的versionchanged:: 2.0.0GET /api/job会同时提供ApiJobResponse与ApiJobResponse_pre_2_0_0两种结构jobState_post_2_0_0使用exclude_noneTrue序列化因此 2.0.0 响应中未设置的字段如lastPrintTime会被省略。启动与重启任务start/restart// 启动当前选中的文件 OctoPrint.job.start(); // 暂停状态下从开头重新打印 OctoPrint.job.restart();这两个方法经由 job.js 调用issueCommand(start/restart, parameters, opts)最终向POST /api/job发送形如{command: start}的 JSON 请求体。后端 controlJob 的处理逻辑如下start若已存在活动任务打印中或已暂停返回 HTTP409提示信息 Printer already has an active print job, did you mean restart?否则调用printer.start_print()。开始打印前需先通过文件 API 的 select 命令选中文件见 docs/api/job.rst 中的说明。restart语义上等价于先取消再立即重新开始。但后端对前置条件有严格要求——当前必须处于暂停状态否则返回409Printer does not have an active print job or is not paused。这与文档中 job.rst 给出的等价写法一致OctoPrint.job.restart(); // 上述调用等价于 OctoPrint.job.cancel() .done(function(response) { OctoPrint.job.start(); });从源码结构看客户端实现的restart是直接下发restart命令而非先 cancel 再 start 的链式调用真正的取消后重启语义由后端一次性完成。暂停、恢复与切换pause/resume/togglePause// 暂停正在打印的任务已暂停时无操作 OctoPrint.job.pause(); // 恢复已暂停的任务正在打印时无操作 OctoPrint.job.resume(); // 在暂停与打印之间切换 OctoPrint.job.togglePause();这三个方法在客户端都发送command: pause区别仅在于action参数见 job.jspause携带action: pause、resume携带action: resume、togglePause携带action: toggle。后端 controlJob 的对应逻辑为action pause若任务正在打印则暂停已暂停则不做任何事action resume若任务已暂停则恢复正在打印则不做任何事action toggle在暂停与打印之间切换未提供action时默认按toggle处理——这是为了向后兼容早期仅提供 toggle 行为的 API 版本原文档与 docs/api/job.rst 均对此有明确说明action为其他值时返回 HTTP400Unknown action。若当前既不在打印也不在暂停状态所有 pause 类命令都会返回409。取消任务cancelOctoPrint.job.cancel() .done(function() { console.log(任务已取消); }) .fail(function(xhr, status, error) { console.error(取消失败:, error); });cancel命令对应后端printer.cancel_print()调用。若当前没有活动任务既未打印也未暂停后端返回409Printer is neither printing nor paused, cancel command cannot be performed。底层机制issueCommand 与命令模式所有控制类方法最终都汇聚到客户端基类的issueCommand见 base.jsOctoPrintClient.prototype.issueCommand function (url, command, payload, opts) { payload payload || {}; var data $.extend({}, payload); data.command command; return this.postJson(url, data, opts); };它把command与额外的payload合并为一个 JSON 对象以application/json内容类型 POST 到目标端点——这正是 OctoPrint 大量命令式 API 端点如文件操作、系统命令的统一模式。在 job.js 中issueCommand被封装为私有辅助函数并固定指向api/jobOctoPrintJobClient.prototype.issueCommand function (command, payload, opts) { if (arguments.length 2) { opts payload; payload {}; } return this.base.issueCommand(url, command, payload, opts); };注意这里存在参数重载只传两个参数时如start(parameters, opts)省略opts第二个参数会被当作opts处理。同时start、restart、pause等方法会先把parameters规范化为普通对象_.isPlainObject(parameters) ? parameters : {}因此调用时完全可以把参数留空。所有任务控制命令都要求PRINT权限查询则要求STATUS权限权限不足时后端返回403。命令执行成功时返回HTTP204 No Content空响应体前置条件不满足时返回409请求体非法时返回400。这些状态码可以直接用于.fail()回调中的错误分支判断。完整示例在插件页面中集成任务控制假设你的页面/插件已按 docs/jsclientlib/index.rst 的方式引入客户端库全局OctoPrint实例并配置好baseurl与apikeyOctoPrint.options.baseurl http://octopi.local/; OctoPrint.options.apikey your-api-key;下面的代码演示了查询 → 按需暂停/恢复 → 取消的典型用法function refreshJobInfo() { OctoPrint.job.get() .done(function(response) { if (response.job response.job.file) { $(#job-name).text(response.job.file.display || response.job.file.name); } $(#job-state).text(response.state); $(#job-progress).text( (response.progress.completion * 100).toFixed(1) % ); }) .fail(function(xhr) { if (xhr.status 403) { console.error(缺少 STATUS 权限); } }); } // 点击按钮暂停/恢复切换 $(#toggle-pause-btn).on(click, function() { OctoPrint.job.togglePause() .done(function() { refreshJobInfo(); }) .fail(function(xhr) { if (xhr.status 409) { console.warn(当前没有活动打印任务); } }); }); // 点击按钮取消任务 $(#cancel-btn).on(click, function() { if (confirm(确定要取消当前打印任务吗)) { OctoPrint.job.cancel(); } });实战注意事项409 是常态而非异常所有控制命令都对当前是否有活动任务有前置条件校验调用前应先用job.get()检查state如Printing、Paused避免无谓的失败请求。restart需要暂停态与直觉不同restart并非在任何状态下都能用必须先暂停任务才能重启。区分查询与控制的权限get仅需STATUS控制类命令均需PRINT在实现权限分级界面时请据此控制按钮显隐。响应体可能省略空字段2.0.0 的GET /api/job使用exclude_noneTrue序列化job.file中的path、display、upload等可空字段在未设置时不会出现在 JSON 中前端取值时应做好空值防护。多服务器场景如需同时连接多个 OctoPrint 实例不要依赖全局OctoPrint而是用new OctoPrintClient({baseurl: ..., apikey: ...})创建独立实例每个实例都会自动装配完整的job组件。延伸阅读JS Client Library 总览与引入方式Job operations API 完整定义与 HTTP 示例客户端 Job 组件实现后端/api/job端点实现Job 响应数据模型Pydantic Schema客户端基础组件与 issueCommand 机制赞分享物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载相关推荐酷安UWP客户端终极上手实战Windows电脑完整畅玩酷安社区的避坑指南酷安UWP客户端终极上手实战Windows电脑完整畅玩酷安社区的避坑指南 酷安是中文互联网里最活跃的数码社区之一可惜它长期长在手机上。想在工作间隙用电脑物联网后端Tolaria 表格公式完全指南IronCalc 引擎、跨笔记引用与 195 个内置函数目录Tolaria 表格公式完全指南IronCalc 引擎、跨笔记引用与 195 个内置函数目录 Tolaria 的表格Sheet编辑器在标准电子表格公式之上物联网后端如何用Automated YouTube Channel打造24/7自动运行的YouTube频道终极指南如何用Automated YouTube Channel打造24/7自动运行的YouTube频道终极指南 Automated YouTube Channel是物联网后端上一篇Stremio-web前端监控告警异常检测与通知机制全解析下一篇【亲测免费】 Gruvbox.nvim —— 为Neovim打造的优雅配色方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考