Сегодня почти каждый проект использует API — будь то для получения погоды, интеграции с внешними сервисами или работы с данными пользователей. Но как работать с API правильно, чтобы не поймать ошибок и не "порвать" сервер? В этой статье мы разберём, как дружить с API от самого начала, а именно: от получения API-ключа до того, как обернуть всё это в production-готовую обёртку.
🧰 Инструменты
Для работы с API мы будем использовать:
- Python 3.7+
- Библиотека requests (для отправки HTTP-запросов)
- JSON (для работы с данными, полученными от API)
Для начала установим библиотеку requests:
pip install requests
Также тебе понадобится API-ключ для доступа к нужному сервису (например, для OpenWeather или GitHub).
1. 📑 Получение API-ключа
OpenWeather API
Зарегистрируйся на OpenWeather и получи API-ключ, который будет использоваться для получения данных о погоде.
GitHub API
Для работы с API GitHub достаточно зарегистрировать OAuth токен (настраивается в разделе Settings > Developer settings > Personal access tokens).
2. 💻 Работа с API через requests
Теперь давай рассмотрим, как отправлять запросы к API и получать ответ.
Пример 1: Получение погоды с OpenWeather
import requests
# Получаем погоду по городу
def get_weather(city):
# Твой API-ключ OpenWeather
api_key = "YOUR_API_KEY"
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric&lang=ru"
response = requests.get(url)
# Проверяем статус-код ответа
if response.status_code == 200:
# Если запрос успешен, обрабатываем JSON
data = response.json()
weather_description = data['weather'][0]['description']
temperature = data['main']['temp']
return f"В городе {city} сейчас {weather_description}, температура: {temperature}°C"
else:
return f"Не удалось получить данные о погоде для города {city}. Статус-код: {response.status_code}"
city = input("Введите город для получения погоды: ")
print(get_weather(city))
🧑🔬 Пояснение:
- Мы строим запрос, подставляя название города и API-ключ.
- Используем метод .get() библиотеки requests для отправки GET-запроса.
- Если статус-код ответа равен 200 (OK), то получаем и обрабатываем данные в формате JSON.
Обработка ошибок
Важно обрабатывать ошибки, ведь запрос может не пройти по разным причинам (например, сервер недоступен или введён неверный город).
def get_weather_safe(city):
try:
weather = get_weather(city)
print(weather)
except requests.exceptions.RequestException as e:
print(f"Произошла ошибка при запросе: {e}")
Теперь если будет ошибка в сети или на сервере, ты получишь понятное сообщение.
3. 🔑 Авторизация и работа с токенами
Многие API, например GitHub или сервисы Google, требуют авторизации для доступа к данным.
Пример 2: Авторизация через токен GitHub API
GitHub требует токен для доступа к личной информации пользователя. Давай напишем запрос для получения списка репозиториев пользователя.
import requests
def get_github_repos(username, token):
url = f"https://api.github.com/users/{username}/repos"
# Заголовок для авторизации через токен
headers = {
'Authorization': f'token {token}'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
repos = response.json()
repo_names = [repo['name'] for repo in repos]
return f"Репозитории пользователя {username}: {', '.join(repo_names)}"
else:
return f"Не удалось получить репозитории. Статус-код: {response.status_code}"
token = "YOUR_GITHUB_TOKEN"
username = input("Введите имя пользователя GitHub: ")
print(get_github_repos(username, token))
🧑🔬 Пояснение:
- В запрос добавляются заголовки, в которых передаётся токен для авторизации.
- Мы используем .json() для получения данных в формате JSON.
4. 🔄 Кеширование данных
Иногда запросы к API могут занимать много времени или часто повторяться. Для таких случаев полезно использовать кеширование — хранить ответ от API, чтобы не отправлять один и тот же запрос несколько раз.
Пример 3: Кеширование погоды
Давай добавим кеширование на время. Если данные о погоде уже были получены в последние 10 минут, мы не будем делать новый запрос.
import time
import pickle
CACHE_FILE = "weather_cache.pkl"
def load_cache():
try:
with open(CACHE_FILE, 'rb') as f:
return pickle.load(f)
except FileNotFoundError:
return {}
def save_cache(data):
with open(CACHE_FILE, 'wb') as f:
pickle.dump(data, f)
def get_weather_cached(city):
cache = load_cache()
current_time = time.time()
if city in cache and current_time - cache[city]['timestamp'] < 600:
print("Используем кешированные данные...")
return cache[city]['data']
print("Запрашиваем данные с API...")
weather = get_weather(city)
cache[city] = {
'timestamp': current_time,
'data': weather
}
save_cache(cache)
return weather
city = input("Введите город для получения погоды: ")
print(get_weather_cached(city))
🧑🔬 Пояснение:
- Мы сохраняем ответы от API в файл с помощью pickle.
- Если данные были получены в течение последних 10 минут, они берутся из кеша.
5. 💡 Обёртка для production
Когда ты развиваешь API-интеграцию, важно сделать её надёжной, масштабируемой и готовой для работы в реальных проектах.
Пример 4: Создаём обёртку для работы с OpenWeather
class WeatherAPI:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "http://api.openweathermap.org/data/2.5/weather"
def get_weather(self, city):
url = f"{self.base_url}?q={city}&appid={self.api_key}&units=metric&lang=ru"
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
return f"В городе {city} сейчас {data['weather'][0]['description']}, температура: {data['main']['temp']}°C"
except requests.exceptions.HTTPError as err:
return f"Ошибка HTTP: {err}"
except requests.exceptions.RequestException as err:
return f"Ошибка запроса: {err}"
weather_api = WeatherAPI("YOUR_API_KEY")
city = input("Введите город для получения погоды: ")
print(weather_api.get_weather(city))
🧑🔬 Пояснение:
- Мы создали класс WeatherAPI, который инкапсулирует логику работы с API.
- Используем метод raise_for_status() для генерации исключений, если статус-код запроса ненормальный.
- Такая обёртка упрощает повторное использование кода и делает его более надёжным.
🚀 Заключение
Теперь ты знаешь, как работать с API: от получения ключа до реализации кеширования и создания production-обёртки. Важно помнить, что правильная авторизация, обработка ошибок и кеширование могут сильно улучшить производительность и надёжность твоего кода.