Python使用urllib3调用API时如何正确获取响应状态码
问题根因
你无法读取到响应状态、触发报错的核心原因有两点,附带代码里的其他易引发问题的错误一并说明:
- 代码存在多处语法/参数错误,导致请求根本没有正常返回标准响应对象,你拿到的
resp不是urllib3的HTTPResponse实例,自然不存在status属性:url参数值漏写字符串引号,你写的url = https://zoola.com/content属于非法Python语法,正确的URL必须是字符串格式'https://zoola.com/content',不要把你命名为https的连接池实例和URL里的HTTPS协议前缀搞混- 所有用到
joy.txt的位置都没加字符串引号:包括请求体字典a里的"name": joy.txt、fields参数里的"file": (joy.txt, file)、"filename": joy.txt,这些位置的joy.txt都是字符串值,必须加引号包裹
- 就算拿到了正常的响应对象,你写的判断逻辑也不成立:urllib3的响应状态码
status是整数类型,不是字符串,和字符串"201"做相等判断永远不会匹配成功。
修正后的可运行代码
import urllib3 import ssl import json # 初始化连接池 urllib3.disable_warnings() # 建议把连接池实例名改为http,避免和URL里的https协议头混淆 http = urllib3.PoolManager(cert_reqs=ssl.CERT_NONE) # 构造请求参数,文件对象建议用上下文管理器自动释放资源 with open("joy.txt", "rb") as f: req_attr = {"name": "joy.txt", "parent": {"id": 4567}} # 传multipart表单时不要手动设置Content-Type请求头,urllib3会自动生成带boundary的合法头 headers = {} # 替换为你实际需要的其他请求头,比如鉴权头 try: resp = http.request( method='POST', url='https://zoola.com/content', headers=headers, fields={ "attributes": json.dumps(req_attr), "file": ("joy.txt", f), "filename": "joy.txt" } ) # 正确读取整数类型的状态码做判断 if resp.status == 201: # 执行201状态对应的成功逻辑 resp_text = resp.data.decode('UTF-8') print("创建成功,响应内容:", resp_text) else: # 其他状态码的异常处理 print(f"请求返回异常状态:{resp.status},响应内容:{resp.data.decode('UTF-8')}") except Exception as e: # 捕获请求发起阶段的异常(网络错误、连接超时、SSL错误、参数构造错误等),这类场景不会返回正常响应对象 print(f"请求发起失败,错误信息:{str(e)}")
额外注意点
- 不要手动在headers里设置
Content-Type: multipart/form-data,urllib3检测到fields里包含文件元组时,会自动生成带随机分隔符(boundary)的Content-Type头,手动设置会导致服务端无法正常解析表单内容 - 所有网络请求逻辑必须加异常捕获,网络波动、服务端宕机、参数错误都可能导致请求直接抛出异常,这类场景下不会生成响应对象,不做捕获会直接中断程序
- 读取本地文件时优先使用
with open()上下文管理器写法,会自动关闭文件释放资源,避免文件句柄泄漏
内容的提问来源于stack exchange,提问作者Baba
相关产品推荐
相关产品推荐

