Python Requests发送POST请求遇400错误:Header名称无效及站点访问问题
解决Createsend POST请求400(Header name invalid)错误的方案
我之前也踩过Createsend订阅接口的坑,结合你提到的POST DATA Error 400:Header name invalid提示和Chrome控制台的信息,问题大概率出在请求头的处理上,咱们一步步来解决:
1. 别把控制台的元数据当成请求头发送
你在Chrome控制台看到的authority、method、path、scheme这些是浏览器展示的请求元数据,不是需要你手动添加到Requests里的请求头!这些字段是浏览器内部处理的,你只需要提取控制台里「Request Headers」板块的真实请求头,比如Accept、User-Agent、Referer这类。
2. 确保请求头的格式合规
Requests要求请求头是标准的键值对,键名不能有特殊字符、大小写错误,也不要手动添加Host、Content-Length这类Requests会自动生成的字段——手动设置这些字段很容易导致格式错误,触发400。
3. 正确构造POST数据
Createsend的securedsubscribe接口一般接收表单格式数据(application/x-www-form-urlencoded),所以要用data参数传递,而不是json参数。同时要确保表单字段和页面上的订阅表单一致(比如Email、Name这类必填项)。
示例代码
import requests # 替换成你获取到的动态token token = "7B9BCC9AE0CD58E2170E07A7D79E679426EBC1D02FA06CA791557CA7ACC1155F5A0DDA83D987E06C" # 正确拼接URL,避免引号或空格错误 url = f"https://www.createsend.com/t/securedsubscribe?token={token}" # 只保留必要的请求头,从Chrome控制台的Request Headers里提取 headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer": "https://www.createsend.com/" # 如果有需要的话添加 } # 表单数据,根据实际订阅表单的字段调整 post_data = { "Email": "your-test-email@example.com", "Name": "Your Name", # 其他必填字段,比如可能存在的列表ID相关字段,从页面表单里找 } try: # 发送POST请求 response = requests.post(url, headers=headers, data=post_data) # 主动抛出HTTP错误,方便排查 response.raise_for_status() print("订阅请求发送成功!") print("响应内容:", response.text) except requests.exceptions.HTTPError as e: print(f"请求失败,错误码: {response.status_code}") print("错误详情:", e) print("服务器响应:", response.text) except Exception as e: print(f"其他异常: {e}")
额外排查技巧
如果还是报错,你可以打印出Requests实际发送的请求头,和Chrome里的正确请求对比:
# 在发送请求后添加这段,查看实际发送的头信息 print("实际发送的请求头:", response.request.headers)
重点检查有没有键名错误(比如拼写错Accept成accept虽然大部分服务器兼容,但个别严格的会报错)、多余的字段(比如把scheme当成头发送)。
内容的提问来源于stack exchange,提问作者PotatoesOnCheese
相关产品推荐
相关产品推荐

