如何修复API请求返回426(Protocol Upgrade Required)错误
解决requests请求返回426 Protocol Upgrade Required的问题
首先,先修正你代码里的一个明显错误:headers字典中'user-agent '的键末尾多了一个空格,这会导致User-Agent头无法被服务器正确识别,这很可能是触发426错误的原因之一。先把这个空格去掉:
headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' }
如果修正后仍然返回426,核心原因是服务器要求升级协议,而requests库默认仅支持HTTP/1.1,你的浏览器大概率自动使用了HTTP/2访问该API,所以能正常获取结果。以下是具体解决步骤:
改用支持HTTP/2的客户端库:
requests本身不支持HTTP/2,你可以使用httpx库,它原生支持HTTP/2协议。安装后按以下方式请求:import httpx # 创建支持HTTP/2的客户端 with httpx.Client(http2=True) as client: response = client.get(myApi, headers=headers, auth=user_name_password) print(response.status_code) print(response.text)检查服务器要求的升级协议:
先打印服务器返回的响应头,确认它要求升级到哪种协议:req = requests.get(myApi, headers=headers, auth=user_name_password) # 查看Upgrade和Connection字段 print("Upgrade:", req.headers.get("Upgrade")) print("Connection:", req.headers.get("Connection"))如果返回的
Upgrade值是h2c(明文HTTP/2),那上面的httpx方案就能解决;如果是其他协议(比如WebSocket),则需要对应调整请求方式。验证认证方式是否匹配:
虽然你在浏览器输入用户名密码能正常访问,但要确认浏览器使用的是Basic Auth还是其他认证方式(比如表单提交后获取Cookie)。如果是后者,你需要先模拟浏览器的登录流程获取Cookie,再携带Cookie发起API请求。
内容的提问来源于stack exchange,提问作者Mohammad Yahia
相关产品推荐
相关产品推荐

