调用qBittorrent Docker容器API时Curl POST请求报Unknown content type: application/json错误求助
调用qBittorrent Docker容器API时Curl POST请求报Unknown content type: application/json错误求助
看起来你被这个API请求的问题卡了一周,太闹心了!我帮你排查下,其实问题出在两个关键地方:Content-Type的大小写问题,还有qBittorrent API对请求格式的特殊要求。
问题1:Content-Type的大小写不兼容
从你的容器日志里能明确看到报错unknown content type: "Application/json"——虽然HTTP协议理论上对Content-Type的大小写不敏感,但qBittorrent的HTTP解析器对这个字段的大小写要求很严格,它只认全小写的application/json,而你写的是Application/json(首字母A大写),这直接导致它识别不了请求格式。
问题2:qBittorrent API的参数格式要求
另外,qBittorrent的setPreferences接口不支持直接发送JSON请求体,它要求用application/x-www-form-urlencoded格式,参数名固定为json,值才是你的JSON配置字符串。这也是你之前反复调整引号却没解决问题的核心原因之一。
修复后的完整脚本
我把你的脚本调整了一下,修复了上述问题,还优化了JSON格式的规范性:
#!/bin/sh GT_IP=10.12.14.5 WEBUI_PORT=8080 #qBittorrent port HTTP_S="http" # read port from control server GT_PORT=$(curl -s http://$GT_IP:8000/v1/openvpn/portforwarded | jq .port) echo "$GT_IP:$GT_PORT" # disable random port curl -v \ --data "json={\"random_port\":false}" \ "$HTTP_S://${GT_IP}:${WEBUI_PORT}/api/v2/app/setPreferences" # change port curl -v \ --data "json={\"listen_port\":${GT_PORT}}" \ "$HTTP_S://${GT_IP}:${WEBUI_PORT}/api/v2/app/setPreferences"
调整说明
- 去掉了所有手动指定的
Content-Type头:因为我们用的是默认的application/x-www-form-urlencoded格式,curl会自动帮我们设置正确的Content-Type,不需要手动干预 - 每个
--data参数都加上了json=前缀:这是qBittorrent API要求的固定格式,它会专门解析这个参数里的JSON内容 - 修正了JSON格式:把非标准的
{random_port:false}改成了符合JSON规范的{"random_port":false}(为键名加上双引号)
额外优化建议
你还可以把两个请求合并成一个,减少一次API调用,提升效率:
# 合并设置:关闭随机端口+设置监听端口 curl -v \ --data "json={\"random_port\":false,\"listen_port\":${GT_PORT}}" \ "$HTTP_S://${GT_IP}:${WEBUI_PORT}/api/v2/app/setPreferences"
这样应该就能彻底解决你遇到的400错误和Unknown content type问题了,快试试吧!




