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

如何通过OctoPrint REST API传递命令?POST请求报错求助

解决OctoPrint REST API POST请求的"Expected content-type JSON"错误及参数位置问题

一、先搞定Content-Type的核心问题

你碰到的Expected content-type JSON错误,十有八九是请求头或者请求体的格式没完全匹配到位,这里有几个容易踩的坑要注意:

  • 必须确保请求头里的Content-Type严格设置为application/json,很多人会不小心写成json或者漏了application/前缀,这直接会触发这个错误。
  • 如果是用代码(比如JavaScript)发送请求,别只改请求头,还要保证请求体是正确序列化的JSON字符串。举个JS的实际例子:
fetch('http://你的OctoPrint地址/api/printer/command', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-Api-Key': '你的API密钥' // 别忘了OctoPrint所有API请求都需要这个密钥验证
  },
  body: JSON.stringify({
    command: 'M104', // 这里填你要执行的G代码命令
    parameters: { S: 200 } // 命令需要的参数放在这个对象里
  })
})

要是你直接传JS对象而不做JSON.stringify,有些请求库会自动把Content-Type改成application/x-www-form-urlencoded,这就会触发错误——所以除非你的请求库明确支持自动序列化对象为JSON(比如axios的data参数),否则JSON.stringify是必须的步骤。

二、命令与端口参数的正确位置

按照OctoPrint的API规范,发送命令时的参数位置是固定的:

  • command字段:直接填你要执行的G代码(比如G28归位、M109等待加热),或者OctoPrint支持的系统级命令(比如pause暂停打印、resume恢复打印),这个字段要放在JSON请求体里。
  • 如果命令需要额外参数(比如M104的喷嘴温度),把参数放在请求体的parameters对象里,键就是G代码的参数标识(比如S对应温度)。
  • 要是你需要指定打印机端口(多打印机场景),端口参数是作为URL的查询参数传递的,比如:http://你的OctoPrint地址/api/printer/command?port=COM3,不要放在请求体里。

给你一个完整的curl示例,方便测试:

curl -X POST \
  http://你的OctoPrint地址/api/printer/command?port=COM3 \
  -H 'Content-Type: application/json' \
  -H 'X-Api-Key: 你的API密钥' \
  -d '{
    "command": "M104",
    "parameters": {
      "S": 200
    }
  }'

三、排查其他可能的隐藏问题

  • 检查API密钥是否正确:密钥可以在OctoPrint的「用户设置」->「API」里找到,别复制错了,少一个字符都不行。
  • 确认请求URL路径正确:打印机命令的端点是/api/printer/command,别把路径写错成其他API端点了。
  • 如果用Postman、Insomnia这类工具测试,一定要在Body里选择「raw」,然后格式选「JSON」,别选成form-data或者x-www-form-urlencoded,否则也会触发内容类型错误。

内容的提问来源于stack exchange,提问作者Bootsie123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:13:17