百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

在 Python 中使用 API python接入api

yuyutoo 2024-10-11 21:40 6 浏览 0 评论

API 或应用程序编程接口是现代 Web 开发中必不可少的工具。它们允许不同的软件系统相互通信。

API 和request库基础知识

API 或应用程序编程接口是一组用于构建软件和应用程序的协议、例程和工具。它指定了软件组件之间应如何交互和通信。从本质上讲,API 通过提供一组规则和定义来允许不同的软件系统相互通信。

API 可以根据其用途分为不同的类型:

  1. Web API:这些是最常见的,旨在通过 Web 进行交互。它们使用 HTTP 请求来 GET、POST、PUT、DELETE 数据。
  2. 库 API:这些 API 用于与软件库和框架连接。
  3. 操作系统 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 数据中的键 nameage 关联的值。

嵌套的 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 密钥。

相关推荐

Mysql和Oracle实现序列自增(oracle创建序列的sql)

Mysql和Oracle实现序列自增/*ORACLE设置自增序列oracle本身不支持如mysql的AUTO_INCREMENT自增方式,我们可以用序列加触发器的形式实现,假如有一个表T_WORKM...

关于Oracle数据库12c 新特性总结(oracle数据库19c与12c)

概述今天主要简单介绍一下Oracle12c的一些新特性,仅供参考。参考:http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NEWFT...

MySQL CREATE TABLE 简单设计模板交流

推荐用MySQL8.0(2018/4/19发布,开发者说同比5.7快2倍)或同类型以上版本....

mysql学习9:创建数据库(mysql5.5创建数据库)

前言:我也是在学习过程中,不对的地方请谅解showdatabases;#查看数据库表createdatabasename...

MySQL面试题-CREATE TABLE AS 与CREATE TABLE LIKE的区别

执行"CREATETABLE新表ASSELECT*FROM原表;"后,新表与原表的字段一致,但主键、索引不会复制到新表,会把原表的表记录复制到新表。...

Nike Dunk High Volt 和 Bright Spruce 预计将于 12 月推出

在街上看到的PandaDunk的超载可能让一些球鞋迷们望而却步,但Dunk的浪潮仍然强劲,看不到尽头。我们看到的很多版本都是为女性和儿童制作的,这种新配色为后者引入了一种令人耳目一新的新选择,而...

美国多功能舰载雷达及美国海军舰载多功能雷达系统技术介绍

多功能雷达AN/SPY-1的特性和技术能力,该雷达已经在美国海军服役了30多年,其修改-AN/SPY-1A、AN/SPY-1B(V)、AN/SPY-1D、AN/SPY-1D(V),以及雷神...

汽车音响怎么玩,安装技术知识(汽车音响怎么玩,安装技术知识视频)

全面分析汽车音响使用或安装技术常识一:主机是大多数人最熟习的音响器材,有关主机的各种性能及规格,也是耳熟能详的事,以下是一些在使用或安装时,比较需要注意的事项:LOUDNESS:几年前的主机,此按...

【推荐】ProAc Response系列扬声器逐个看

有考牌(公认好声音)扬声器之称ProAcTablette小音箱,相信不少音响发烧友都曾经,或者现在依然持有,正当大家逐渐掌握Tablette的摆位设定与器材配搭之后,下一步就会考虑升级至表现更全...

#本站首晒# 漂洋过海来看你 — BLACK&DECKER 百得 BDH2000L无绳吸尘器 开箱

作者:初吻给了烟sco混迹张大妈时日不短了,手没少剁。家里有了汪星人,吸尘器使用频率相当高,偶尔零星打扫用卧式的实在麻烦(汪星人:你这分明是找借口,我掉毛是满屋子都有,铲屎君都是用卧式满屋子吸的,你...

专题|一个品牌一件产品(英国篇)之Quested(罗杰之声)

Quested(罗杰之声)代表产品:Q212FS品牌介绍Quested(罗杰之声)是录音监听领域的传奇品牌,由英国录音师RogerQuested于1985年创立。在成立Quested之前,Roger...

常用半导体中英对照表(建议收藏)(半导体英文术语)

作为一个源自国外的技术,半导体产业涉及许多英文术语。加之从业者很多都有海外经历或习惯于用英文表达相关技术和工艺节点,这就导致许多英文术语翻译成中文后,仍有不少人照应不上或不知如何翻译。为此,我们整理了...

Fyne Audio F502SP 2.5音路低音反射式落地音箱评测

FyneAudio的F500系列,有新成员了!不过,新成员不是新的款式,却是根据原有款式提出特别版。特别版产品在原有型号后标注了SP字样,意思是SpecialProduction。Fyne一共推出...

有哪些免费的内存数据库(In-Memory Database)

以下是一些常见的免费的内存数据库:1.Redis:Redis是一个开源的内存数据库,它支持多种数据结构,如字符串、哈希表、列表、集合和有序集合。Redis提供了快速的读写操作,并且支持持久化数据到磁...

RazorSQL Mac版(SQL数据库查询工具)

RazorSQLMac特别版是一款看似简单实则功能非常出色的SQL数据库查询、编辑、浏览和管理工具。RazorSQLformac特别版可以帮你管理多个数据库,支持主流的30多种数据库,包括Ca...

取消回复欢迎 发表评论: