在 Python 中使用 API python接入api
yuyutoo 2024-10-11 21:40 4 浏览 0 评论
API 或应用程序编程接口是现代 Web 开发中必不可少的工具。它们允许不同的软件系统相互通信。
API 和request库基础知识
API 或应用程序编程接口是一组用于构建软件和应用程序的协议、例程和工具。它指定了软件组件之间应如何交互和通信。从本质上讲,API 通过提供一组规则和定义来允许不同的软件系统相互通信。
API 可以根据其用途分为不同的类型:
- Web API:这些是最常见的,旨在通过 Web 进行交互。它们使用 HTTP 请求来 GET、POST、PUT、DELETE 数据。
- 库 API:这些 API 用于与软件库和框架连接。
- 操作系统 API:这些 API 允许应用程序与操作系统交互。
Web API 特别强大,因为它们使不同的应用程序能够通过 Internet 进行交互,从而可以集成不同的服务和功能。例如,可以使用 weather API 来获取应用程序的天气数据,或者使用社交媒体 API 来集成社交共享功能。
为什么使用 API?
API 对于现代 Web 开发至关重要,原因如下:
- 模块化:API 允许应用程序的不同部分进行通信,从而可以以模块化方式构建复杂的系统。
- 可重用性:API 使开发人员能够在不同的项目中重用代码,从而节省时间和精力。
- 可扩展性:通过使用 API,您可以更轻松地扩展应用程序,因为不同的组件可以独立扩展。
- 集成:API 可以轻松集成第三方服务和数据,从而增强应用程序的功能。
什么是 Requests 库?
requests 库是用于发出 HTTP 请求的常用 Python 库。它抽象了简单而优雅的 API 背后发出请求的复杂性,使其成为 Python 开发人员最喜欢的工具。
请求库简化了发送 HTTP/1.1 请求、处理响应和管理 HTTP 连接等任务。以下是 requests 库的一些主要功能:
- 简单直观的 API:该库为发出 HTTP 请求提供了一个简单的界面。
- 支持 HTTP 方法:它支持所有主要的 HTTP 方法(GET、POST、PUT、DELETE、HEAD、OPTIONS)。
- 自动内容解码:自动解码来自服务器的内容。
- 连接持久性:支持与同一主机的持久连接。
- SSL 验证:支持 SSL 证书验证。
- 代理:允许您通过代理发送请求。
安装
在开始使用 requests 库之前,您需要安装它。安装 requests 库的最简单方法是使用 pip(Python 包安装程序)。打开终端或命令提示符并运行以下命令:
pip install requests
此命令将下载并安装 requests 库及其依赖项。安装完成后,您可以开始在 Python 脚本中使用该库。
了解 HTTP 状态代码
HTTP 状态代码由服务器颁发,以响应客户端向服务器发出的请求。它们可帮助您了解请求的结果。一些常见的状态代码包括:
- 200 OK:请求成功。
- 201 Created:请求成功,并已创建新资源。
- 400 Bad Request:由于语法无效,服务器无法理解请求。
- 401 未授权:客户端必须对自身进行身份验证才能获得请求的响应。
- 404 Not Found:服务器找不到请求的资源。
- 500 Internal Server Error:服务器遇到了不知道如何处理的情况。
API 是允许不同软件系统通信和共享数据的强大工具。Python 中的 requests 库提供了一种与 Web API 交互的简单而优雅的方法,从而可以轻松发送 HTTP 请求和处理响应。
发出基本 API 请求
使用 API 时最常见的操作之一是发送 GET 请求。GET 请求用于从服务器检索数据。这是最简单的 HTTP 请求类型,使用 requests 库很容易执行。以下是发送基本 GET 请求的方法:
import requests
response = requests.get('https://api.example.com/data')
print(response.status_code) # Prints the HTTP status code of the response
print(response.text) # Prints the raw text of the response
在此示例中,我们使用 requests.get() 方法向特定 URL 发送 GET 请求。来自服务器的响应存储在响应对象中。此对象具有多个属性和方法,用于访问响应数据。
访问响应数据
响应对象包含服务器返回的数据。您可以根据响应的类型,以各种格式访问此数据。以下是访问响应数据的一些常见方法:
- 原始文本:您可以使用 .text 属性获取响应的原始文本。
print(response.text) # Prints the raw text content of the response
- JSON:如果响应是 JSON 格式(这在 API 中很常见),您可以使用 .json() 方法对其进行解析。
data = response.json() # Parses the response content as JSON
print(data)
- Status Code(状态代码):.status_code 属性为您提供响应的 HTTP 状态代码。
print(response.status_code) # Prints the HTTP status code
处理响应
当发出请求时,您会收到来自服务器的响应。正确处理这些响应非常重要,尤其是检查请求是否成功。以下是如何处理响应的不同部分的示例:
response = requests.get('https://api.example.com/data')
if response.status_code == 200:
data = response.json() # Parse JSON data
print("Success:", data)
elif response.status_code == 404:
print("Error: Resource not found")
else:
print(f"Request failed with status code: {response.status_code}")
在此示例中,我们检查响应的状态代码。如果状态代码为 200(表示成功),我们将解析 JSON 数据。如果状态代码为 404(表示未找到资源),我们将打印错误消息。对于任何其他状态代码,我们将打印状态代码以指示请求失败。
添加查询参数
通常,您可能需要在 GET 请求中包含查询参数。将查询参数添加到 URL 以指定请求条件。requests 库可以使用 params 参数轻松添加这些参数:
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://api.example.com/data', params=params)
print(response.url) # Prints the full URL with query parameters
print(response.json())
在此示例中,我们创建一个查询参数字典并将其传递给 params 参数。请求库会自动将这些参数附加到 URL。
发送标头
有时,可能需要在请求中发送自定义标头。标头可以包括身份验证令牌、内容类型和其他元数据。您可以使用 headers 参数向请求添加标头:
headers = {'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}
response = requests.get('https://api.example.com/data', headers=headers)
print(response.status_code)
print(response.json())
在此示例中,我们创建一个 headers 字典并将其传递给 headers 参数。Authorization 标头通常用于持有者令牌身份验证。
超时
为了防止程序在等待响应时无限期挂起,您可以为请求指定超时。timeout 参数指定等待响应的最大秒数:
response = requests.get('https://api.example.com/data', timeout=5)
print(response.status_code)
在此示例中,如果从服务器获取响应的时间超过 5 秒,则请求将引发异常。
错误处理
使用 API 时,处理请求期间可能发生的潜在错误非常重要。requests 库提供了多种正常处理错误的方法。下面是一个示例:
try:
response = requests.get('https://api.example.com/data')
response.raise_for_status() # Raises an HTTPError for bad responses
data = response.json()
print(data)
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except requests.exceptions.ConnectionError as err:
print(f"Connection error occurred: {err}")
except requests.exceptions.Timeout as err:
print(f"Timeout error occurred: {err}")
except requests.exceptions.RequestException as err:
print(f"An error occurred: {err}")
在此示例中,我们使用 try-except 块来捕获和处理不同类型的异常。raise_for_status() 方法为不成功的状态代码引发 HTTPError。我们还处理连接错误、超时和任何其他请求异常。
使用 JSON 数据
JSON 或 JavaScript Object Notation 是一种轻量级数据交换格式,易于人类读写,也易于机器解析和生成。JSON 在 Web 应用程序中广泛用于在客户端和服务器之间交换数据。它是独立于语言的,这意味着它可以与各种编程语言一起使用,包括 Python。
JSON 对象是键值对的集合,类似于 Python 字典。以下是 JSON 对象的示例:
{
"name": "Alexander Obregon",
"age": 28,
"city": "Wisconsin"
}
解析 JSON 响应
当您向返回 JSON 数据的 API 发出请求时,requests 库可以轻松解析和处理此数据。响应对象的 .json() 方法用于解析 JSON 数据并将其转换为 Python 字典。
以下是如何解析 JSON 响应的示例:
import requests
response = requests.get('https://api.example.com/data')
if response.status_code == 200:
data = response.json()
print(data)
else:
print(f"Request failed with status code: {response.status_code}")
在此示例中,我们将 GET 请求发送到返回 JSON 数据的 API 终端节点。我们通过检查状态代码来检查请求是否成功。如果状态代码为 200,我们使用 .json() 方法解析 JSON 响应并打印生成的 Python 字典。
访问 JSON 数据
解析 JSON 响应后,您可以使用标准字典操作访问生成的 Python 字典中的各个元素。下面是一个示例:
response = requests.get('https://api.example.com/data')
data = response.json()
print(data['name']) # Accessing a value by key
print(data.get('age')) # Using the get method to access a value
在此示例中,我们访问与 JSON 数据中的键 name 和 age 关联的值。
嵌套的 JSON 对象
JSON 数据可以嵌套,这意味着它可以包含其他 JSON 对象或数组。下面是嵌套 JSON 对象的示例:
{
"name": "Alexander Obregon",
"age": 28,
"address": {
"street": "Cheese St",
"city": "Wisconsin"
},
"phoneNumbers": ["123-555-7890", "987-555-3210"]
}
要访问嵌套数据,您可以链接字典操作。以下是访问上述示例中嵌套数据的方法:
response = requests.get('https://api.example.com/data')
data = response.json()
print(data['address']['city']) # Accessing nested data
print(data['phoneNumbers'][0]) # Accessing data in a list
在此示例中,我们访问嵌套 address 对象中的 city 值和 phoneNumbers 数组中的第一个电话号码。
修改 JSON 数据
还可以在解析 JSON 数据后对其进行修改。由于解析的 JSON 是 Python 字典,因此您可以使用标准字典方法来更新它。下面是一个示例:
response = requests.get('https://api.example.com/data')
data = response.json()
data['age'] = 31 # Modifying a value
data['address']['city'] = 'Los Angeles' # Modifying nested data
print(data)
在此示例中,我们将 age 值更改为 31,并将 address 对象中的 city 值更改为 Los Angeles。
使用 POST 请求发送 JSON 数据
除了解析 JSON 响应之外,您还可以使用 POST 请求将 JSON 数据发送到 API。当您使用 json 参数时,requests 库会自动将 Python 词典转换为 JSON 格式,从而简化此操作。
以下是如何使用 POST 请求发送 JSON 数据的示例:
import requests
payload = {
"name": "Alexander Obregon",
"age": 28,
"city": "Wisconsin"
}
response = requests.post('https://api.example.com/submit', json=payload)
print(response.status_code)
print(response.json())
在此示例中,我们创建了一个名为 payload 的字典,其中包含我们要发送的数据。我们使用 requests.post() 方法向 API 发送 POST 请求,并将有效负载字典传递给 json 参数。requests 库会自动将字典转换为 JSON 对象。
错误处理和最佳实践
使用 API 时,实施强大的错误处理来管理 HTTP 请求期间可能出现的潜在问题至关重要。Python 中的 requests 库提供了多种有效处理错误的方法。
HTTP 错误
当服务器返回指示请求问题的状态代码时,将发生 HTTP 错误。requests 库可以使用 raise_for_status() 方法自动为这些错误引发异常:
import requests
try:
response = requests.get('https://api.example.com/data')
response.raise_for_status() # Raises an HTTPError for bad responses
data = response.json()
print(data)
except requests.exceptions.HTTPError as http_err:
print(f"HTTP error occurred: {http_err}")
except Exception as err:
print(f"An error occurred: {err}")
在此示例中,如果状态代码不是 2xx(成功),则 raise_for_status() 会引发 HTTPError。我们使用 try-except 块处理此错误。
连接错误
当客户端无法连接到服务器时,会发生连接错误。requests 库提供了一个 ConnectionError 异常来处理这些错误:
try:
response = requests.get('https://api.example.com/data')
response.raise_for_status()
data = response.json()
print(data)
except requests.exceptions.ConnectionError as conn_err:
print(f"Connection error occurred: {conn_err}")
except Exception as err:
print(f"An error occurred: {err}")
在此示例中,我们捕获 ConnectionError 以处理无法访问服务器的情况。
超时错误
当服务器响应时间过长时,会发生超时错误。为了防止程序无限期挂起,您可以设置超时并处理 Timeout 异常:
try:
response = requests.get('https://api.example.com/data', timeout=5)
response.raise_for_status()
data = response.json()
print(data)
except requests.exceptions.Timeout as timeout_err:
print(f"Timeout error occurred: {timeout_err}")
except Exception as err:
print(f"An error occurred: {err}")
在此示例中,我们设置了 5 秒的超时。如果服务器响应的时间超过此时间,则会引发 Timeout 异常。
其他请求例外
requests 库还提供了一个 RequestException 基类,用于捕获所有类型的与请求相关的错误。这对于捕获可能发生的任何意外错误非常有用:
try:
response = requests.get('https://api.example.com/data')
response.raise_for_status()
data = response.json()
print(data)
except requests.exceptions.RequestException as req_err:
print(f"Request error occurred: {req_err}")
except Exception as err:
print(f"An error occurred: {err}")
在此示例中,RequestException 捕获与请求相关的任何错误,从而提供常规错误处理机制。
最佳实践
为了确保您的代码可靠且可维护,在使用 API 时遵循最佳实践非常重要。以下是一些需要考虑的关键做法:
检查响应状态代码
始终检查响应的状态代码,以确保请求成功。这有助于您适当地处理不同的场景:
response = requests.get('https://api.example.com/data')
if response.status_code == 200:
data = response.json()
print(data)
elif response.status_code == 404:
print("Error: Resource not found")
else:
print(f"Request failed with status code: {response.status_code}")
使用超时
要防止程序无限期挂起,请对请求使用 timeouts。这可确保即使服务器运行缓慢,应用程序也能保持响应:
response = requests.get('https://api.example.com/data', timeout=5)
处理速率限制
API 通常具有速率限制以防止滥用。请遵守这些限制以避免被阻止。您可以通过检查响应中的相关标头并使用指数退避实施重试来处理速率限制:
import time
def make_request_with_retry(url, retries=3, backoff_factor=0.3):
for attempt in range(retries):
try:
response = requests.get(url)
response.raise_for_status()
return response
except requests.exceptions.HTTPError as err:
if response.status_code == 429: # Too Many Requests
time.sleep((2 ** attempt) * backoff_factor)
else:
raise err
response = make_request_with_retry('https://api.example.com/data')
print(response.json())
在此示例中,我们实现了一个具有指数退避的重试机制来处理速率限制。
验证和清理输入
在 API 请求中发送输入之前,请务必验证和清理输入,以防止注入攻击并确保数据完整性。使用 re 等库进行正则表达式验证,或使用 jsonschema 等库进行 JSON 架构验证。
import re
def is_valid_email(email):
pattern = r'^[\w\.-]+@[\w\.-]+\.\w+#39;
return re.match(pattern, email)
email = "test@example.com"
if is_valid_email(email):
response = requests.post('https://api.example.com/submit', json={'email': email})
print(response.status_code)
else:
print("Invalid email address")
保护敏感数据
不要在代码中对敏感信息(如 API 密钥或令牌)进行硬编码。使用环境变量或配置文件安全地存储它们:
import os
api_key = os.getenv('API_KEY')
headers = {'Authorization': f'Bearer {api_key}'}
response = requests.get('https://api.example.com/data', headers=headers)
print(response.json())
在此示例中,我们使用环境变量安全地存储 API 密钥。
相关推荐
- 史上最全的浏览器兼容性问题和解决方案
-
微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...
-
- 平面设计基础知识_平面设计基础知识实验收获与总结
-
CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...
-
2025-02-21 16:01 yuyutoo
- 写作排版简单三步就行-工具篇_作文排版模板
-
和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...
- 写一个2048的游戏_2048小游戏功能实现
-
1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...
- 今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……
-
最近的天气暖和得让很多小伙伴们喊“热”!!! 昨天的气温到底升得有多高呢?你家有没有榜上有名?...
- CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式
-
之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...
- 你的自我界限够强大吗?_你的自我界限够强大吗英文
-
我的结果:A、该设立新的界限...
- 行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?
-
行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...
-
- 让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
-
去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...
-
2025-02-21 16:00 yuyutoo
- 今年国家综合性消防救援队伍计划招录消防员15000名
-
记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...
- 一起盘点最新 Chrome v133 的5大主流特性 ?
-
1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...
- 竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使
-
style="text-align:center;"data-mce-style="text-align:...
- 学物理能做什么?_学物理能做什么 卢昌海
-
作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...
-
- 你不知道的关于这只眯眼兔的6个小秘密
-
在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...
-
2025-02-21 16:00 yuyutoo
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)