> 技术文档 > 【Python】API常用的调用方式解析_python调用api

【Python】API常用的调用方式解析_python调用api


【Python】API常用的调用方式解析

  • 一、引言
  • 二、常用方式介绍
  • 三、实现与案例
    • 1.requests
    • 2.http.client
    • 3.urllib(轻量级方案)
    • 4.aiohttp(异步方案)
  • 四、总结对比

一、引言

数据开发中,调用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 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()))

四、总结对比

方法 适用场景 性能表现 难度 requests 常规REST API调用 ★★★★☆ 简单 http.client 底层协议控制 ★★☆☆☆ 中等 urllib 简单请求/无依赖环境 ★★★☆☆ 简单 aiohttp 高并发/异步任务 ★★★★★ 复杂