Работа с файлами и изображениями через WP REST API — одна из востребованных задач при интеграции WordPress с внешними сервисами и мобильными приложениями. В этой статье разберем, как корректно отправлять файлы (например, изображения) на сервер через REST API, учитывая требования по авторизации и безопасности. Также приведем примеры кода для реализации такого функционала.
Особенности отправки файлов через WP REST API
Стандартные REST API эндпоинты WordPress поддерживают загрузку медиафайлов через метод POST на endpoint /wp/v2/media. Однако, чтобы отправка прошла успешно, необходимо учитывать несколько важных моментов:
- Правильный Content-Type в запросе: для отправки файлов обычно используется
multipart/form-data. - Обязательная авторизация пользователя с правами на добавление медиа (обычно роль редактор или выше).
- Обработка ошибок и валидация файлов на стороне сервера.
Без этих условий запросы будут отклонены или обработаны некорректно.
Типы авторизации в WP REST API
Для авторизации при загрузке рекомендуется использовать один из следующих способов:
- Basic Auth — простая авторизация по логину и паролю. Подходит для разработки, но не рекомендуется для продакшена.
- OAuth 2.0 — более безопасный способ авторизации, но требует дополнительной настройки.
- JWT (JSON Web Token) — популярный современный метод, удобный для SPA и мобильных приложений.
Выбор зависит от архитектуры вашего приложения и требований безопасности.
Пример отправки файла через WP REST API с Basic Auth
Рассмотрим пример загрузки изображения на WordPress с использованием Basic Auth и PHP. Для начала убедитесь, что на сервере активирован плагин для Basic Auth, например, WP Basic Auth.
$url = 'https://example.com/wp-json/wp/v2/media';
$username = 'admin';
$password = 'password';
$file_path = '/path/to/image.jpg';
$file_name = basename($file_path);
$file_data = file_get_contents($file_path);
$headers = [
'Authorization: Basic ' . base64_encode($username . ':' . $password),
'Content-Disposition: attachment; filename="' . $file_name . '"',
'Content-Type: image/jpeg'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $file_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code === 201) {
echo "Файл успешно загружен: $response";
} else {
echo "Ошибка загрузки: $response";
}
Этот пример показывает базовую отправку файла методом POST с нужными заголовками. В ответе вы получите JSON с информацией о загруженном медиафайле.
Обработка ошибок при загрузке
Если загрузка не прошла, API обычно возвращает статус 400 или 401. Для диагностики важно выводить ответ сервера. Например, отсутствие авторизации вернет ошибку:
{
"code": "rest_cannot_create",
"message": "Sorry, you are not allowed to create resources.",
"data": {
"status": 401
}
}
Убедитесь, что пользователь аутентифицирован и имеет право создавать медиафайлы.
Отправка файлов через JavaScript с JWT авторизацией
Для современных SPA часто используют JWT-токены. Рассмотрим пример загрузки файла через fetch API с JWT.
async function wpapiSendFile(file) {
const token = localStorage.getItem('jwt_token'); // Предполагается, что токен уже получен
const url = 'https://example.com/wp-json/wp/v2/media';
const formData = new FormData();
formData.append('file', file);
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + token
},
body: formData
});
if (response.ok) {
const data = await response.json();
console.log('Файл загружен:', data);
} else {
const error = await response.json();
console.error('Ошибка загрузки:', error);
}
}
Здесь важно не указывать заголовок Content-Type вручную, чтобы браузер сам установил корректный boundary для multipart/form-data.
Получение JWT токена
Для получения JWT токена можно использовать плагин JWT Authentication for WP REST API или аналогичные решения. Запрос на получение токена выглядит так:
POST /wp-json/jwt-auth/v1/token
{
"username": "admin",
"password": "password"
}
В ответ придет токен, который нужно сохранить и использовать в заголовках для аутентифицированных запросов.
Безопасность и рекомендации
При работе с загрузкой файлов через REST API важно соблюдать правила безопасности:
- Проверяйте тип и размер загружаемых файлов на стороне сервера.
- Используйте защищенные протоколы (HTTPS) для передачи данных.
- Ограничивайте доступ к эндпоинтам через права пользователей.
- Рассмотрите возможность внедрения капчи или лимитов на загрузку для предотвращения атак.
Плагины вроде Clearfy Pro помогут улучшить безопасность и оптимизировать работу REST API.
Заключение
Отправка файлов и изображений через WP REST API — задача, которую можно решить с помощью стандартных эндпоинтов и правильной авторизации. Главное — корректно формировать запросы, обрабатывать ошибки и обеспечивать безопасность. Пример кода на PHP и JavaScript поможет быстро интегрировать этот функционал в ваши проекты.