You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

调用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问题了,快试试吧!

火山引擎 最新活动