【Python】API常用的调用方式解析_python调用api
【Python】API常用的调用方式解析
- 一、引言
- 二、常用方式介绍
- 三、实现与案例
-
- 1.requests
- 2.http.client
- 3.urllib(轻量级方案)
- 4.aiohttp(异步方案)
- 四、总结对比
一、引言
在数据开发中,调用API是连接外部服务、获取数据或实现系统集成的核心方式之一。
最近由于阿里云ODPS安全限制问题,处理了一批API调用的任务,所以从原理、案例和优缺点等维度,写一写python调用API的常用方式介绍。
二、常用方式介绍
Python调用API的主要方法可分为以下四类,每种方式的特点和适用场景有些许差异:
三、实现与案例
1.requests
- 原理:通过封装HTTP请求方法,简化参数传递和响应处理,自动处理URL编码、连接池管理和响应解析,支持JSON解析、Session会话、文件上传等功能。
- 优点:代码简洁、功能全面
- 缺点:请求IO密集型场景效率较低
import requestsdef get_github_user(username): \"\"\" 使用requests库调用GitHub API获取用户信息 \"\"\" # 构造API请求 url = f\"https://api.github.com/users/{username}\" try: # 发送GET请求(自动处理连接和关闭) response = requests.get(url, timeout=5) # 检查HTTP状态码 if response.status_code == 200: # 解析JSON响应数据 user_data = response.json() return { \"name\": user_data.get(\"name\"), \"location\": user_data.get(\"location\"), \"public_repos\": user_data.get(\"public_repos\") } else: print(f\"请求失败,状态码:{response.status_code}\") except requests.exceptions.RequestException as e: print(f\"请求异常:{str(e)}\")# 调用示例if __name__ == \"__main__\": print(get_github_user(\"octocat\")) # GitHub官方测试账号
2.http.client
- 原理:内置的底层HTTP客户端库,手动管理连接生命周期和报文头构造,适合需要精细控制HTTP协议的场景
- 优点:直接可用、细粒度控制
- 缺点:代码冗长、需手动处理编码和连接
import http.clientimport jsondef get_httpbin_data(): \"\"\" 使用http.client获取httpbin测试数据 \"\"\" # 创建对象 conn = http.client.HTTPSConnection(\"httpbin.org\") try: # 发送GET请求 conn.request(\"GET\", \"/get\") # 获取响应对象 response = conn.getresponse() # 读取响应体并解码 data = response.read().decode(\'utf-8\') # 解析JSON数据 return json.loads(data) except Exception as e: print(f\"请求异常:{str(e)}\") finally: # 必须手动关闭连接 conn.close()# 调用示例if __name__ == \"__main__\": print(get_httpbin_data())
3.urllib(轻量级方案)
- 原理:复合型HTTP工具,集成request/error/parse等模块,适合简单请求和无需依赖的环境
- 优点:轻量级
- 缺点:接口设计分散、缺少高级功能
from urllib.request import urlopenimport jsondef get_user_agent(): \"\"\" 使用urllib获取客户端UA信息 \"\"\" url = \"http://httpbin.org/user-agent\" try: # 打开连接,自动处理HTTP/HTTPS with urlopen(url, timeout=5) as response: # 读取并解析JSON数据 return json.loads(response.read().decode()) except Exception as e: print(f\"请求异常:{str(e)}\")# 调用示例if __name__ == \"__main__\": print(get_user_agent())
4.aiohttp(异步方案)
- 原理:基于asyncio的异步HTTP客户端,使用协程实现非阻塞IO操作,适合高并发场景(如爬虫、实时系统)
- 优点:高吞吐量、资源利用率高
- 缺点:需要异步编程知识、调试复杂度高
import aiohttpimport asyncioasync def fetch_concurrent_data(): \"\"\" 使用aiohttp并发获取多个API数据 \"\"\" urls = [ \"https://jsonplaceholder.typicode.com/posts/1\", \"https://jsonplaceholder.typicode.com/comments/1\" ] # 创建共享会话(自动管理连接池) async with aiohttp.ClientSession() as session: tasks = [] for url in urls: # 创建并发任务 task = asyncio.create_task( session.get(url, timeout=aiohttp.ClientTimeout(total=3)) ) tasks.append(task) # 等待所有任务完成 responses = await asyncio.gather(*tasks) results = [] for response in responses: # 检查响应状态 if response.status == 200: data = await response.json() results.append(data) return results# 调用示例if __name__ == \"__main__\": print(asyncio.run(fetch_concurrent_data()))