Python requests.get()返回空结果:Jenkins插件API调用问题排查
为什么用requests.get调用Jenkins插件API返回空响应,改用Session却能正常工作?
咱们直接说核心问题:你最初的代码根本没机会获取到JSON响应,问题出在return语句的顺序错误,和Session的使用其实没有直接关联——不过改用Session的过程帮你修正了代码结构,才让结果正常显示。
原代码的致命错误
先看你最初的代码:
import requests def get_deps(): url = "https://plugins.jenkins.io/api/plugin/CFLint" headers = { "Connection": "keep-alive", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br" } reqs = requests.get(url, headers) return reqs.status_code # 这行直接终止了函数! return reqs.json() # 这行代码永远不会被执行 get_deps()
这里有两个问题:
- 提前return终止函数:函数执行到
return reqs.status_code就会立刻结束,后面的return reqs.json()完全没机会运行。所以你调用get_deps()时,得到的只是HTTP状态码,根本没去读取API返回的JSON数据——这就是你觉得“返回空响应”的本质原因。 - headers参数传递错误:
requests.get(url, headers)的写法不对,headers需要用headers=headers关键字参数传递,否则会被当成params(URL参数)处理,导致请求头设置无效。不过这不是你拿不到JSON的主要原因,主要还是return顺序的问题。
修改后的代码为什么能正常工作?
再看你修改后的代码:
s = requests.Session() def get_deps(): url = "https://plugins.jenkins.io/api/plugin/CFLint" reqs = s.get(url) res = reqs.json() print(res) get_deps()
这里的关键改进是:
- 你去掉了提前终止的
return reqs.status_code,正确地调用reqs.json()解析响应并打印结果,这才是能拿到数据的核心原因。 - 改用
requests.Session()的作用是维持会话(比如自动保持cookie、复用连接),但在这个场景里,不用Session直接用普通的requests.get()也能正常工作,只要修正return顺序和headers传递方式。比如修正后的普通写法:
import requests def get_deps(): url = "https://plugins.jenkins.io/api/plugin/CFLint" headers = { "Connection": "keep-alive", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br" } reqs = requests.get(url, headers=headers) # 显式指定headers参数 return reqs.json() # 正确的return位置 print(get_deps())
你之前在Postman能正常获取,是因为Postman的请求参数和头都正确,而且没有提前终止的逻辑。
总结最初出错的原因
最初问题的根源就是函数内的return语句顺序错误,提前返回状态码导致后续读取JSON的代码无法执行。改用Session的过程中你重构了代码,去掉了错误的return,所以能正常拿到响应。另外原代码中headers参数的传递方式也有误,需要用关键字参数显式指定。
内容的提问来源于stack exchange,提问作者CK5
相关产品推荐
相关产品推荐

