调用Cloudflare API获取子域名ID时持续返回400错误求助
以下是导致你调用Cloudflare API获取DNS记录时返回400(Bad Request)的常见原因,结合你的代码逐一分析:
URL拼接格式错误
检查CLOUDFLARE_API_URL的末尾是否包含斜杠/。Cloudflare DNS记录API的正确格式为https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records,如果你的CLOUDFLARE_API_URL没有带末尾的斜杠,拼接后会变成类似https://api.cloudflare.com/client/v4/zonesZONE_ID/dns_records的错误URL,直接触发400错误。子域名格式不完整
API的name参数需要传入完整的域名(比如sub.yourdomain.com),如果你传入的subdomain变量只是前缀(比如sub),Cloudflare无法识别该参数,会返回400。授权头格式错误
注意区分Cloudflare的两种密钥类型:- 使用API Token时,授权头格式是
Authorization: Bearer {token}(你的代码当前用的是这种) - 使用Global API Key时,授权头格式必须是
Authorization: Cloudflare {你的邮箱}:{Global Key}
若你混淆了密钥类型,会导致请求格式错误,触发400(部分情况会返回403,但格式不规范时也可能返回400)。
- 使用API Token时,授权头格式是
参数未做URL编码
你直接将subdomain拼接到URL中,如果子域名包含特殊字符(虽然域名本身不允许,但存在转义需求时),会导致URL格式非法。建议改用requests的params参数传递查询条件,它会自动处理URL编码:url = CLOUDFLARE_API_URL + CLOUDFLARE_ZONE_ID + '/dns_records' response = requests.get(url, headers=headers, params={'name': subdomain})不必要的请求头
GET请求不需要设置Content-Type: application/json,虽然大部分API会忽略这个头,但少数情况下可能会被判定为请求格式错误,尝试移除该头后重试。
另外,建议在代码中增加错误日志输出,打印response.text,Cloudflare的错误响应会包含具体的错误信息,能更快定位问题:
if response.status_code != 200: print(response.text)
内容的提问来源于stack exchange,提问作者BestRazer

