Python requests调用REST接口返回404,curl请求正常求排查
排查requests.get返回404但curl正常的问题
这个情况我碰到好多次了,大概率是请求头的差异导致的,而非服务器刻意拦截(当然也不能完全排除,但先从最常见的点开始排查)。
最可能的原因:请求头不一致
curl和requests默认发送的请求头有不少区别,很多服务器会校验这些头部信息,不符合就返回404。比如:
- User-Agent差异:curl的默认UA是类似
curl/7.68.0(具体版本看你的curl),而requests默认是python-requests/x.x.x,有些服务器会拒绝非浏览器/非curl的UA请求。 - Accept头差异:curl默认的
Accept是*/*,而requests默认的Accept是更复杂的多类型组合,部分服务器只认可简单的Accept值。
解决办法:模拟curl的请求头
先通过curl -v http://xx.xx.xx.xx/server/rest/line/125查看curl发送的完整请求头(找> Host:、> User-Agent:、> Accept:这些行),然后在requests里完全复刻这些头部:
import requests # 把下面的headers换成curl -v输出里的实际值 headers = { 'User-Agent': 'curl/7.68.0', 'Accept': '*/*', 'Host': 'xx.xx.xx.xx' # 可选,大部分情况下requests会自动添加,但保险起见可以加上 } resp = requests.get('http://xx.xx.xx.xx/server/rest/line/125', headers=headers) print(resp.status_code) print(resp.text)
其他排查方向
如果上面的方法没用,再检查这几个点:
- URL一致性:确认requests里的URL和curl里的完全一致,有没有拼写错误、多余的空格或者转义问题(虽然你用了r字符串,但还是仔细核对一遍)。
- Cookie/会话问题:如果之前用curl访问过该接口并保存了cookie,服务器可能依赖会话cookie,这时候需要用requests的
Session()来复用会话,或者手动添加curl里的Cookie头。 - 代理设置:curl可能使用了系统代理,而requests没有,或者反过来。可以在requests里添加
proxies参数,或者关闭代理试试。 - 重定向问题:curl默认会自动跟随重定向,requests默认也是,但可以检查
resp.history看看有没有重定向过程,确认最终请求的URL是否正确。
内容的提问来源于stack exchange,提问作者sonox
相关产品推荐
相关产品推荐

