如何通过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
相关产品推荐
相关产品推荐

