python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python调用API方式

Python调用API的常用方式解析

作者:看海的四叔

在数据开发中,调用API是连接外部服务、获取数据或实现系统集成的核心方式之一,最近由于阿里云ODPS安全限制问题,处理了一批API调用的任务,所以从原理、案例和优缺点等维度,写一写python调用API的常用方式介绍,需要的朋友可以参考下

一、引言

在数据开发中,调用API是连接外部服务、获取数据或实现系统集成的核心方式之一。
最近由于阿里云ODPS安全限制问题,处理了一批API调用的任务,所以从原理、案例和优缺点等维度,写一写python调用API的常用方式介绍。

二、常用方式介绍

Python调用API的主要方法可分为以下四类,每种方式的特点和适用场景有些许差异:

方法原理适用场景
requests基于HTTP的第三方库,封装GET/POST等请求方法,提供简洁的API调用接口。常规HTTP请求、快速开发、数据交互
http.clientPython内置HTTP库,需手动构建请求头和报文,精细控制请求的场景。低层级操作、兼容性要求高
urllib标准库模块,包含urllib.request等子模块,基础核心。简单请求、无需依赖第三方库的场景
aiohttp基于异步IO的HTTP库,通过协程实现非阻塞请求,适用高并发场景。异步编程、高并发API调用

三、实现与案例

1.requests

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

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(轻量级方案)

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(异步方案)

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方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文