Ubuntu环境下requests无法调用服务获取数据,但浏览器可正常访问
问题描述
我将service与调用它的Python程序均运行在Ubuntu环境下。开发的应用程序会调用该service获取JSON格式的pandas DataFrame数据,该service在返回数据前会将内容打印到控制台。通过浏览器测试service可正常工作,能看到JSON化的数据;但使用Python的requests库调用时,程序无响应,无法获取返回结果。相关代码如下:
def get_RRDf(ticker, date_years_ago, wind): print("Entering get_rrDf") build_params = "thresh=.20&symbol=" + ticker +"&window=" + str(wind) + "&lookback=5" api_url = "http://xx.xx.xx.xx:3000/RR/"+build_params print(api_url) app_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0' } response = requests.get(api_url, headers=app_headers) print("==================") print(type(response)) print(response.text) print("==================") ...
排查与解决建议
- 修正URL参数格式:当前代码把查询参数直接拼接在路径后,符合HTTP规范的写法应该是将参数放在
?之后,例如http://xx.xx.xx.xx:3000/RR?thresh=.20&symbol=xxx&window=xxx&lookback=5。浏览器可能自动修正了错误格式,但requests不会,service可能因路径解析异常导致阻塞。 - 添加请求超时限制:在
requests.get中加入timeout参数,比如requests.get(api_url, headers=app_headers, timeout=10),避免程序无限等待,同时能捕获超时类错误信息。 - 检查service运行状态与日志:确认Python发起请求时,service是否接收到请求、是否有报错输出。若service未收到请求,排查Ubuntu防火墙是否拦截3000端口,或确认目标IP/端口是否正确;若收到请求但未返回,排查service处理Python请求时是否出现逻辑阻塞。
- 对比浏览器与requests的请求头:用浏览器开发者工具(F12)查看请求的完整头信息,与代码中的
app_headers对比,确认是否遗漏Accept等关键头字段,部分service会校验此类字段。 - 用curl工具测试:在Ubuntu终端执行
curl -v "你的完整API地址",验证是否能正常获取响应。若curl同样无响应,问题出在service或网络层面;若curl正常,再聚焦排查requests代码的细节问题。 - 更新requests库版本:旧版本requests可能存在兼容性问题,执行
pip install --upgrade requests更新至最新版本后重试。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

