一、引言
在数据开发中,调用api是连接外部服务、获取数据或实现系统集成的核心方式之一。
最近由于阿里云odps安全限制问题,处理了一批api调用的任务,所以从原理、案例和优缺点等维度,写一写python调用api的常用方式介绍。
二、常用方式介绍
python调用api的主要方法可分为以下四类,每种方式的特点和适用场景有些许差异:
| 方法 | 原理 | 适用场景 |
|---|---|---|
| requests | 基于http的第三方库,封装get/post等请求方法,提供简洁的api调用接口。 | 常规http请求、快速开发、数据交互 |
| http.client | python内置http库,需手动构建请求头和报文,精细控制请求的场景。 | 低层级操作、兼容性要求高 |
| urllib | 标准库模块,包含urllib.request等子模块,基础核心。 | 简单请求、无需依赖第三方库的场景 |
| aiohttp | 基于异步io的http库,通过协程实现非阻塞请求,适用高并发场景。 | 异步编程、高并发api调用 |
三、实现与案例
1.requests
- 原理:通过封装http请求方法,简化参数传递和响应处理,自动处理url编码、连接池管理和响应解析,支持json解析、session会话、文件上传等功能。
- 优点:代码简洁、功能全面
- 缺点:请求io密集型场景效率较低
import requests
def 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.client
import json
def 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 urlopen
import json
def 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 aiohttp
import asyncio
async 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()))
四、总结对比
| 方法 | 适用场景 | 性能表现 | 难度 |
|---|---|---|---|
| requests | 常规rest api调用 | ★★★★☆ | 简单 |
| http.client | 底层协议控制 | ★★☆☆☆ | 中等 |
| urllib | 简单请求/无依赖环境 | ★★★☆☆ | 简单 |
| aiohttp | 高并发/异步任务 | ★★★★★ | 复杂 |
到此这篇关于python调用api的常用方式解析的文章就介绍到这了,更多相关python调用api方式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论