在 Python 中使用 API(python接入api)
off999 2024-11-02 12:32 27 浏览 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 密钥。
相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
-
TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
-
其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...
- 性能测试100集(12)性能指标资源使用率
-
在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...
- Linux 服务器常见的性能调优_linux高性能服务端编程
-
一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...
- Nginx性能优化实战:手把手教你提升10倍性能!
-
关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
-
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...
- Kubernetes 高并发处理实战(可落地案例 + 源码)
-
目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...
- 高并发场景下,Nginx如何扛住千万级请求?
-
Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
-
SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...
- Docker-基础操作_docker基础实战教程二
-
一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...
- 你有空吗?跟我一起搭个服务器好不好?
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...
- 部署你自己的 SaaS_saas如何部署
-
部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...
- Docker Compose_dockercompose安装
-
DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
-
前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
-
Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
