在 Python 中使用 API python接入api
yuyutoo 2024-10-11 21:40 2 浏览 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 密钥。
相关推荐
- jQuery VS AngularJS 你更钟爱哪个?
-
在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...
- Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0
-
在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...
- 如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例
-
要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...
- 编程技巧:Jquery实时验证,指定长度的「负小数」
-
为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...
- 一篇文章带你用jquery mobile设计颜色拾取器
-
【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...
- 编程技巧:Jquery实时验证,指定长度的「正小数」
-
为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...
- jquery.validate检查数组全部验证
-
问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...
- Vue进阶(幺叁肆):npm查看包版本信息
-
第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...
- layui中使用lay-verify进行条件校验
-
一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...
- jQuery是什么?如何使用? jquery是什么功能组件
-
jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...
- django框架的表单form的理解和用法-9
-
表单呈现...
- jquery对上传文件的检测判断 jquery实现文件上传
-
总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- 大数据开发基础之JAVA jquery 大数据java实战
-
上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...
- 推荐四个开源的jQuery可视化表单设计器
-
jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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)