注册

解决 Python requests.post() 返回 406 错误

解决 Python requests.post() 返回 406 错误


HTTP 406 "Not Acceptable" 错误表示服务器无法生成符合客户端请求中 Accept 头部指定的响应内容。


问题分析,最好的方法还是一段代码一段代码的调试


今天是模型一个登录的脚本,以前都用得好好的,现在突然不行了,出现了406的错误,觉得有点奇怪,代码如下:


header = {'Content-Type':'application/x-www-form-urlencoded',
'User-Agent':'Mozilla/5.0 (Macint0sh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36'

form_data = {
"actionFlag":"login",
"uid":"xxxxx",
"password":"xxxxx"
}

data = parse.urlencode(from_data)
response = request.post(url=login_url,header=header, data = data, verify=False)

以前上面这段代码是没有什么问题的,但最近才发现一直是406,跟踪到代码中的
sessions.py中adapter的值是对的,上面是显示访问成功而且返回值是200,这说明访问代码是没有问题的,但什么时候出的问题呢?继续往下


image.png


发现了这一段代码,其中allow_redirects的值就有点意思了,这个值的默认值是Ture,但我们登录后,后面肯定有一个redirect的,也就是说后面那个跳转的地址有问题了,所以才会导致出问题


image.png


所以只需要将这个参数设计为false就正常了


allow_redirects=False

下面是我解决问题时用deepseek查问题时,出现的一些总结,也不能说它全部不对,但也是由于这个让我有了一些思路,所以放上来,大家参考一下也是好了。


常见原因及解决方案


1. 请求头 (headers) 问题


确保你的请求头中包含正确的 Accept 和 Content-Type


python


headers = {
'Accept': 'application/json', # 或其他服务器期望的类型
'Content-Type': 'application/json', # 或其他适当的内容类型
# 其他必要的头部,如授权信息
}

2. 数据格式问题


确保发送的数据格式与 Content-Type 头部匹配:


python


import json

data = {'key': 'value'}
response = requests.post(url, data=json.dumps(data), headers=headers)

或者使用 json 参数自动处理:


python


response = requests.post(url, json=data, headers=headers)

3. 用户代理问题


有些服务器要求特定的 User-Agent:


python


headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...',
# 其他头部
}

4. 认证问题


如果 API 需要认证,确保提供了正确的凭证:


python


headers = {
'Authorization': 'Bearer your_token_here',
# 其他头部
}

5. 服务器端限制


检查 API 文档,确认:



  • 是否支持 POST 方法
  • 是否接受你发送的内容类型
  • 是否有其他特殊要求

完整示例


python


import requests
import json

url = 'https://api.example.com/endpoint'
headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'User-Agent': 'MyApp/1.0',
'Authorization': 'Bearer abc123...'
}
data = {'key1': 'value1', 'key2': 'value2'}

try:
response = requests.post(url, json=data, headers=headers)
response.raise_for_status() # 如果响应状态码不是200,抛出异常
print(response.json())
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")

如果问题仍然存在,建议:



  1. 检查 API 文档的具体要求
  2. 使用开发者工具查看浏览器发送的成功请求的格式
  3. 联系 API 提供商获取支持

作者:吴尊和
来源:juejin.cn/post/7522002830929379368

0 个评论

要回复文章请先登录注册