- 1. Руководство для пользователей мобильных приложений
- 2. Руководство для разработчиков
- 3. Переход с API v1 на V2
- 3.1. Аутентификация (auth.php)
- 3.2. Загрузка файлов (upload.php)
1. Руководство для пользователей мобильных приложений
1.1. Введение в API v2
API v2 Battery Wizard предоставляет программный интерфейс для взаимодействия с системой управления батареями через мобильные приложения Android и iOS. Система позволяет:
- Авторизоваться в системе
- Искать информацию о батареях
- Загружать файлы тестирования
- Получать информацию о профиле пользователя
- Работать с данными компании и тарифами
1.2. Аутентификация и авторизация
1.2.1. Процесс входа в систему
Для доступа к API необходимо пройти аутентификацию:
POST /v2/auth.php
Content-Type: application/json
{
"username": "ваш_логин",
"password": "ваш_пароль",
"uuid": "уникальный_идентификатор_устройства",
"os": "Android/iOS",
"version": "1.0.0"
}
Ответ при успешной аутентификации:
{
"success": true,
"code": 200,
"message": "Authentication successful",
"timestamp": "2024-01-15T10:30:00+03:00",
"data": {
"token": "abc123def456ghi789",
"user": {
"id": 123,
"login": "username",
"email": "user@example.com",
"personal_info": {
"first_name": "Иван",
"last_name": "Петров",
"position": "Инженер"
}
},
"company": {
"name": "ООО Ромашка",
"contact_info": {
"phone": "+79101234567",
"email": "company@example.com"
}
},
"tariff": {
"name": "Профессиональный",
"duration_days": 30
},
"token_expiry_days": 30
}
}
1.2.2. Использование токена доступа
После получения токена, все последующие запросы должны включать его в заголовки:
Authorization: Bearer abc123def456ghi789
Или как параметр URL:
GET /v2/battery.php?token=abc123def456ghi789
1.3. Работа с батареями
1.3.1. Поиск батарей
Базовый поиск:
GET /v2/battery.php?q=поисковый_запрос
Authorization: Bearer ваш_токен
Расширенный поиск с параметрами:
GET /v2/battery.php?q=Delta 12V 100Ah&limit=20&only_self=1
Параметры поиска:
q— поисковый запрос (обязательный)limit— количество результатов (по умолчанию 10, максимум 50)only_self— фильтр по доступности:0— все доступные батареи (по умолчанию)1— только батареи пользователя2— только батареи компании
Пример ответа:
{
"success": true,
"code": 200,
"data": {
"batteries": [
{
"id": 456,
"model": "DTM1234",
"manufacturer": "Delta",
"brand": "Delta",
"capacity": "100.00Ah",
"voltage": "12.00V",
"display_text": "ID:456 | Delta DTM1234 (100.00Ah / 12.00V)"
}
],
"total": 1,
"search_query": "Delta 12V 100Ah"
}
}
1.3.2. Получение детальной информации о батарее
GET /v2/battery.php?id=456
Authorization: Bearer ваш_токен
Пример ответа:
{
"success": true,
"code": 200,
"data": {
"battery": {
"id": 456,
"model": "DTM1234",
"manufacturer": "Delta",
"brand": "Delta",
"battery_type": "Свинцово-кислотная",
"capacity": 100.00,
"voltage": 12.00,
"year": 2023,
"weight": 25.5,
"dimensions": {
"length": 300,
"width": 150,
"height": 200
},
"specifications": {
"c1_capacity": 95.00,
"c5_capacity": 98.00,
"c10_capacity": 100.00,
"charge_current": 25.0,
"discharge_current": 200.0,
"lifetime": 5,
"terminals": "M8"
},
"power_kwh": 1.200,
"created": "2023-05-15 14:30:00"
}
}
}
1.4. Загрузка файлов тестирования
1.4.1. Поддерживаемые форматы файлов
Разрешенные расширения:
- RTA, PDF, TXT, FBO
- JSON, XML, CSV, ZIP
Максимальный размер: 100 МБ
Запрещенные типы: PHP, HTML, скрипты (SH, PL, CGI и др.)
1.4.2. Процесс загрузки файла
POST /v2/upload.php
Authorization: Bearer ваш_токен
Content-Type: multipart/form-data
Файл: file=[выбранный_файл]
Пример успешного ответа:
{
"success": true,
"code": 200,
"message": "File uploaded successfully",
"data": {
"file_id": 7890,
"filename": "test_20240115.rta",
"size": 1048576,
"uploaded_at": "2024-01-15T11:45:00+03:00"
}
}
1.4.3. Ошибки при загрузке
413 Payload Too Large— файл превышает 100 МБ415 Unsupported Media Type— неверный тип файла422 Validation Error— ошибка валидации файла
1.5. Управление профилем пользователя
1.5.1. Получение информации о профиле
GET /v2/user.php
Authorization: Bearer ваш_токен
Пример ответа:
{
"success": true,
"code": 200,
"data": {
"user": {
"id": 123,
"login": "ivanov",
"email": "ivanov@company.ru",
"personal_info": {
"first_name": "Иван",
"last_name": "Иванов",
"position": "Старший инженер",
"phone": "+79101234567"
},
"company": {
"name": "ООО Техносервис",
"full_name": "Общество с ограниченной ответственностью 'Техносервис'"
},
"tariff": {
"name": "Профессиональный",
"duration_days": 30,
"features": [
"Неограниченное количество тестов",
"Расширенная аналитика",
"Приоритетная поддержка"
]
},
"registration_date": "2023-01-15 09:00:00"
},
"company": {
"id": 56,
"name": "ООО Техносервис",
"contact_info": {
"address": "г. Москва, ул. Ленина, 1",
"phone": "+74951234567",
"email": "info@techservice.ru"
},
"statistics": {
"user_count": 15,
"branch_count": 3
}
}
}
}
1.6. Обработка ошибок и коды ответов
1.6.1. Основные HTTP статусы
200 OK— запрос выполнен успешно400 Bad Request— неверный формат запроса401 Unauthorized— требуется аутентификация403 Forbidden— доступ запрещен404 Not Found— ресурс не найден422 Validation Error— ошибка валидации данных500 Internal Server Error— внутренняя ошибка сервера
1.6.2. Формат сообщений об ошибках
{
"success": false,
"code": 401,
"message": "Authentication required",
"timestamp": "2024-01-15T12:00:00+03:00",
"data": {}
}
1.7. Часто задаваемые вопросы
Вопрос: Что делать, если токен перестал работать?
Ответ: Токены действительны 30 дней. При истечении срока необходимо заново пройти аутентификацию.
Вопрос: Почему файл не загружается?
Ответ: Проверьте:
- Размер файла (максимум 100 МБ)
- Расширение файла (только разрешенные типы)
- Наличие действующего токена
Вопрос: Как искать батареи по нескольким параметрам?
Ответ: Используйте пробелы для разделения ключевых слов: «Delta 12V 100Ah»
2. Руководство для разработчиков
2.1. Архитектура API v2
2.1.1. Общая схема системы
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Mobile App │ ◄─ │ API v2 │ ◄─ │ Database │
│ (Android/iOS) │ │ PHP Backend │ │ MySQL 5.7+ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
┌────────┴────────┐
│ File System │
│ (Uploads) │
└─────────────────┘
2.1.2. Структура каталогов
/v2/
├── config.php # Конфигурация и настройки
├── APIResponse.php # Унифицированные ответы
├── TokenManager.php # Управление токенами
├── BatteryService.php # Сервис батарей
├── UserService.php # Сервис пользователей
├── auth.php # Аутентификация
├── battery.php # API батарей
├── user.php # API пользователя
└── upload.php # Загрузка файлов
2.2. Настройка окружения разработки
2.2.1. Требования к серверу
- PHP: 8.3 или выше
- MySQL: 5.7 или выше
- Расширения PHP:
- mysqli
- json
- fileinfo
- openssl
2.2.2. Конфигурация базы данных
Создайте файл конфигурации или используйте существующий:
<?php
// /config.php (существующий файл)
$GLOBALS['DB_Server'] = 'localhost';
$GLOBALS['DB_Name'] = 'wizard_online';
$GLOBALS['DB_User'] = 'username';
$GLOBALS['DB_Password'] = 'password';
$GLOBALS['mysqlix'] = new mysqli(...);
2.2.3. Настройки безопасности
В APIConfig.php установите:
class APIConfig {
const MAX_FILE_SIZE = 100 * 1024 * 1024;
const TOKEN_EXPIRY_DAYS = 30;
const ALLOWED_EXTENSIONS = ['RTA', 'PDF', 'TXT', 'FBO', 'JSON', 'XML', 'CSV', 'ZIP'];
const DANGEROUS_EXTENSIONS = ['php', 'htm', 'html', 'sh', 'pl', 'cgi', 'exe'];
}
2.3. Детальное описание модулей
2.3.1. APIConfig — класс конфигурации
Назначение: Централизованное хранение настроек и констант
Основные методы:
getDBConnection()— получение соединения с БДvalidateFileUpload()— валидация загружаемых файлов
Пример использования:
$db = APIConfig::getDBConnection();
APIConfig::validateFileUpload($_FILES['file']);
2.3.2. APIResponse — унифицированные ответы
Назначение: Стандартизация формата ответов API
Основные методы:
success($data, $message)— успешный ответerror($code, $message, $details)— ответ с ошибкойvalidationError($errors)— ошибки валидации
Пример:
APIResponse::success(['user' => $user], 'User found');
APIResponse::error(404, 'User not found');
2.3.3. TokenManager — управление токенами
Назначение: Создание, валидация и управление JWT-подобными токенами
Основные методы:
createToken($userId, $uuid, $os, $version)— создание токенаvalidateToken($token)— проверка токенаinvalidateToken($token)— отзыв токена
Схема работы:
$tokenManager = new TokenManager($db);
$token = $tokenManager->createToken(123, 'uuid-123', 'Android', '1.0.0');
$user = $tokenManager->validateToken($token);
2.3.4. BatteryService — сервис батарей
Назначение: Поиск и управление данными батарей
Основные методы:
search($query, $limit, $onlySelf)— поиск батарейgetBatteryDetails($batteryId)— детальная информация
Алгоритм поиска:
- Построение фильтра доступа
- Парсинг поискового запроса
- Построение условий поиска по множеству полей
- Форматирование результатов
2.3.5. UserService — сервис пользователей
Назначение: Управление профилями пользователей и компаний
Основные методы:
getUserProfile($userId)— профиль пользователяgetCompanyInfo($companyId)— информация о компанииgetTariffInfo($tariffId)— данные тарифа
2.4. Инструкция по доработке и расширению
2.4.1. Добавление нового endpoint
Шаг 1: Создайте новый файл API
<?php
// /v2/new_endpoint.php
declare(strict_types=1);
require_once 'config.php';
require_once 'APIResponse.php';
require_once 'TokenManager.php';
try {
$db = APIConfig::getDBConnection();
$tokenManager = new TokenManager($db);
// Validate token
$token = getBearerToken();
$user = $tokenManager->validateToken($token);
if (!$user) {
APIResponse::unauthorized();
}
// Handle request
switch ($_SERVER['REQUEST_METHOD']) {
case 'GET':
// Process GET request
break;
case 'POST':
// Process POST request
break;
default:
APIResponse::error(405, 'Method not allowed');
}
} catch (Exception $e) {
error_log("New endpoint error: " . $e->getMessage());
APIResponse::error(500, 'Internal server error');
}
Шаг 2: Создайте соответствующий сервис
<?php
// /v2/NewService.php
declare(strict_types=1);
class NewService {
private mysqli $db;
public function __construct(mysqli $db) {
$this->db = $db;
}
public function processRequest(array $user, array $input): array {
// Business logic here
return ['result' => 'success'];
}
}
2.4.2. Расширение существующих сервисов
Добавление нового метода в BatteryService:
public function getBatteryStatistics(int $batteryId): array {
$stmt = $this->db->prepare("
SELECT
COUNT(*) as test_count,
AVG(Capacity) as avg_capacity,
MIN(TestDate) as first_test,
MAX(TestDate) as last_test
FROM Files
WHERE BatteryID = ? AND UserID = ?
");
$stmt->bind_param('ii', $batteryId, $this->userId);
$stmt->execute();
return $stmt->get_result()->fetch_assoc() ?: [];
}
2.4.3. Кастомизация валидации
Расширение проверки файлов:
class CustomAPIConfig extends APIConfig {
const CUSTOM_ALLOWED_TYPES = ['RTA', 'PDF', 'CUSTOM'];
public static function validateCustomFile(array $file): void {
parent::validateFileUpload($file);
// Дополнительная проверка
if ($file['size'] < 100) {
throw new InvalidArgumentException('File too small');
}
}
}
2.5. Рекомендации по безопасности
2.5.1. Защита от SQL-инъекций
Всегда используйте подготовленные запросы:
// Правильно
$stmt = $db->prepare("SELECT * FROM Users WHERE ID = ?");
$stmt->bind_param('i', $userId);
$stmt->execute();
// Неправильно
$db->query("SELECT * FROM Users WHERE ID = $userId"); // Уязвимо!
2.5.2. Валидация входных данных
public function validateInput(array $input): array {
$errors = [];
// Проверка email
if (!filter_var($input['email'], FILTER_VALIDATE_EMAIL)) {
$errors['email'] = 'Invalid email format';
}
// Проверка числовых значений
if (!is_numeric($input['user_id']) || $input['user_id'] <= 0) {
$errors['user_id'] = 'Invalid user ID';
}
return $errors;
}
2.5.3. Обработка файлов
public function safeFileUpload(array $file): string {
// Проверка MIME типа
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);
if (!in_array($mime, self::ALLOWED_MIME_TYPES)) {
throw new InvalidArgumentException('Invalid file type');
}
// Генерация безопасного имени файла
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
$safeName = bin2hex(random_bytes(16)) . '.' . $extension;
return $safeName;
}
2.6. Производительность и оптимизация
2.6.1. Кэширование запросов
class CachedBatteryService extends BatteryService {
private $cache;
public function __construct(mysqli $db, CacheInterface $cache) {
parent::__construct($db);
$this->cache = $cache;
}
public function getBatteryDetails(int $batteryId): ?array {
$cacheKey = "battery_{$batteryId}";
if ($cached = $this->cache->get($cacheKey)) {
return $cached;
}
$battery = parent::getBatteryDetails($batteryId);
$this->cache->set($cacheKey, $battery, 3600); // Кэш на 1 час
return $battery;
}
}
2.6.2. Оптимизация поисковых запросов
public function optimizedSearch(string $query, int $limit = 10): array {
// Использование полнотекстового поиска если доступно
if (strlen($query) > 3) {
return $this->fullTextSearch($query, $limit);
}
return $this->standardSearch($query, $limit);
}
private function fullTextSearch(string $query, int $limit): array {
$stmt = $this->db->prepare("
SELECT * FROM Battery
WHERE MATCH(Model, Manufacturer) AGAINST(? IN BOOLEAN MODE)
LIMIT ?
");
$stmt->bind_param('si', $query, $limit);
$stmt->execute();
return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}
2.7. Мониторинг и логирование
2.7.1. Структура логов
class APILogger {
public static function logRequest(string $endpoint, array $user, array $data): void {
$logEntry = [
'timestamp' => date('c'),
'endpoint' => $endpoint,
'user_id' => $user['UserID'] ?? null,
'ip' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
'request_data' => $data,
'response_code' => http_response_code()
];
file_put_contents(
'/var/log/v2/requests.log',
json_encode($logEntry) . PHP_EOL,
FILE_APPEND
);
}
}
2.7.2. Метрики производительности
class APIMetrics {
public static function measureExecutionTime(callable $function): array {
$startTime = microtime(true);
$startMemory = memory_get_usage();
$result = $function();
return [
'execution_time' => microtime(true) - $startTime,
'memory_used' => memory_get_usage() - $startMemory,
'result' => $result
];
}
}
// Использование
$metrics = APIMetrics::measureExecutionTime(function() use ($service, $input) {
return $service->processRequest($input);
});
2.8. Тестирование API
2.8.1. Unit-тесты для сервисов
class BatteryServiceTest extends PHPUnit\Framework\TestCase {
private $db;
private $service;
protected function setUp(): void {
$this->db = $this->createMock(mysqli::class);
$user = ['UserID' => 1, 'CompanyID' => 1, 'Login' => 'test'];
$this->service = new BatteryService($this->db, $user);
}
public function testSearchWithEmptyQuery(): void {
$result = $this->service->search('', 10, 0);
$this->assertIsArray($result);
$this->assertArrayHasKey('batteries', $result);
}
}
2.8.2. Интеграционные тесты
# Пример тестирования с curl
curl -X GET "https://api.batterywizard.ru/v2/battery.php?q=test" \
-H "Authorization: Bearer test_token" \
-H "Content-Type: application/json"
Эта документация предоставляет полное руководство для использования и разработки API v2 Battery Wizard, охватывая все аспекты от базового использования до продвинутых тем разработки и оптимизации.
3. Переход с API v1 на V2
3.1. Аутентификация (auth.php)
Совместимость с v1
✅ Полная обратная совместимость — API v2 поддерживает все форматы запросов и ответов из v1. Существующие приложения будут работать без изменений.
Отличия между v1 и v2
| Функция | v1 | v2 |
|---|---|---|
| Формат запроса | Только POST данные | POST данные + JSON |
| Параметры | login, password, api | login/username, password, api + опциональные |
| Аутентификация | Сессионные файлы | Token-based + сессионные файлы |
| Расширенные данные | Нет | По запросу (extended=true) |
3.1.1. Endpoint URL
POST /api/v2/auth.php
3.1.2. Поддерживаемые форматы запроса
1. Форма данных (v1 совместимость)
POST /api/v2/auth.php
Content-Type: application/x-www-form-urlencoded
login=test_v2&password=UIGD56fv%2BX&api=1.0
2. JSON данные (v2 улучшение)
POST /api/v2/auth.php
Content-Type: application/json
{
"login": "test_v2",
"password": "UIGD56fv+X",
"api": "1.0",
"uuid": "device-unique-id",
"os": "Android",
"version": "2.0.0"
}
3.1.3. Параметры запроса
| Параметр | Обязательный | Тип | Описание | Совместимость |
|---|---|---|---|---|
login | Да | String | Имя пользователя | v1 + v2 |
username | Нет | String | Альтернатива login | v2 |
password | Да | String | Пароль пользователя | v1 + v2 |
api | Да | String | Версия API | v1 + v2 |
uuid | Нет | String | Уникальный ID устройства | v2 |
os | Нет | String | ОС устройства | v2 |
version | Нет | String | Версия приложения | v2 |
extended | Нет | String | Расширенные данные | v2 |
3.1.4. Ответы API
Успешная аутентификация (v1 формат)
{
"ok": "true",
"code": "200",
"message": "",
"token": "abc123def456ghi789",
"name": "test_v2",
"phone": "+79104149561",
"tariff": "Профессиональный",
"tariffId": "2",
"serial": "SN12534734",
"expired": "2024-12-31"
}
Успешная аутентификация с расширенными данными (v2)
{
"ok": "true",
"code": "200",
"message": "",
"token": "abc123def456ghi789",
"name": "test_v2",
"phone": "+79104149561",
"tariff": "Профессиональный",
"tariffId": "2",
"serial": "SN12534734",
"expired": "2024-12-31",
"v2_data": {
"user": {
"id": 123,
"login": "test_v2",
"email": "user@example.com",
"personal_info": {
"first_name": "Иван",
"last_name": "Петров",
"position": "Инженер"
}
},
"company": {
"id": 56,
"name": "ООО Техносервис",
"contact_info": {
"address": "г. Москва, ул. Ленина, 1",
"phone": "+74951234567"
}
}
}
}
Ошибка аутентификации
{
"ok": "false",
"code": "403",
"message": "Invalid credentials",
"token": "",
"name": "",
"phone": "",
"tariff": "",
"tariffId": "",
"serial": "",
"expired": "01.01.2024"
}
3.1.5. Коды ошибок
| Код HTTP | Код ответа | Сообщение | Описание |
|---|---|---|---|
| 400 | 400 | Missing required parameters | Отсутствуют обязательные параметры |
| 403 | 403 | Invalid credentials | Неверный логин или пароль |
| 403 | 403 | API version required | Отсутствует параметр api |
| 500 | 500 | Internal server error | Внутренняя ошибка сервера |
3.2. Загрузка файлов (upload.php)
3.2.0. Совместимость с v1
✅ Полная обратная совместимость — поддерживаются все методы загрузки и форматы из v1.
3.2.1. Безопасность файлов
Запрещенные расширения (черный список)
Файлы со следующими расширениями блокируются:
- Исполняемые:
php,php3-8,phtml,exe,com,bat,cmd,msi - Скрипты:
sh,bash,pl,py,rb,js,vbs - Веб-файлы:
htm,html,shtml,asp,aspx,jsp - Архивы с риском:
jar,app,dmg
Разрешенные файлы
Все остальные расширения разрешены, включая:
- Данные тестов:
RTA,FBO,TXT - Документы:
PDF,DOC,DOCX,XLS - Архивы:
ZIP(с проверкой содержимого) - Изображения:
JPG,PNG,GIF
3.2.2. Endpoint URL
POST /api/v2/upload.php
3.2.3. Методы аутентификации
1. Bearer Token (v2 рекомендуемый)
POST /api/v2/upload.php
Authorization: Bearer abc123def456ghi789
Content-Type: multipart/form-data
2. Параметр token (v1 совместимость)
POST /api/v2/upload.php
Content-Type: multipart/form-data
token=abc123def456ghi789&file=@test.rta
3.3.4. Методы загрузки файлов
1. Multipart Form Data (рекомендуемый)
POST /api/v2/upload.php
Authorization: Bearer abc123def456ghi789
Content-Type: multipart/form-data
-- Form Data --
upload_file: [бинарные данные файла]
-- или --
file: [бинарные данные файла]
2. JSON с содержимым файла (v2)
POST /api/v2/upload.php
Authorization: Bearer abc123def456ghi789
Content-Type: application/json
{
"token": "abc123def456ghi789",
"file": "base64-encoded-content",
"filename": "test_2024.rta"
}
3. Параметр file (v1 совместимость)
POST /api/v2/upload.php
Content-Type: application/x-www-form-urlencoded
token=abc123def456ghi789&file=raw-file-content
3.3.5. Параметры запроса
| Параметр | Обязательный | Тип | Описание | Совместимость |
|---|---|---|---|---|
token | Да* | String | Токен аутентификации | v1 + v2 |
upload_file | Нет† | File | Файл для загрузки | v1 + v2 |
file | Нет† | File/String | Альтернативное поле файла | v1 + v2 |
filename | Нет | String | Имя файла (если не из формы) | v2 |
*Токен можно передать в заголовке Authorization или в параметрах
†Один из параметров файла обязателен
3.3.6. Ограничения
| Параметр | Значение | Описание |
|---|---|---|
| Максимальный размер | 800 001 111 байт (~800 МБ) | Совместимо с v1 |
| Минимальный размер | 5 байт | Совместимо с v1 |
| Таймаут загрузки | 30 секунд | v2 улучшение |
| Проверка MIME типа | Да | v2 улучшение |
3.3.7. Ответы API
Успешная загрузка
{
"ok": "true",
"code": "200",
"message": "Uploaded",
"id": "12345"
}
Ошибки загрузки
Неверный размер файла:
{
"ok": "false",
"code": "403",
"message": "Invalid file size (0). Allowed size is between 5 and 800001111 bytes."
}
Запрещенный тип файла:
{
"ok": "false",
"code": "403",
"message": "File extension 'php' is not allowed for security reasons"
}
Ошибка аутентификации:
{
"ok": "false",
"code": "403",
"message": "Invalid or expired token"
}
3.3.8. Коды ошибок
| Код HTTP | Код ответа | Сообщение | Причина |
|---|---|---|---|
| 400 | 400 | No file content provided | Не передан файл |
| 403 | 403 | Token required | Отсутствует токен |
| 403 | 403 | Invalid or expired token | Неверный токен |
| 403 | 403 | Invalid file size | Неверный размер файла |
| 403 | 403 | File extension ‘X’ not allowed | Запрещенное расширение |
| 403 | 403 | File type ‘X’ not allowed | Запрещенный MIME тип |
| 500 | 500 | Internal server error | Ошибка сервера |
3.3.9. Особенности обработки
Автоматическое определение даты
Система автоматически извлекает дату тестирования из имени файла в формате:
YYYY.MM.DD.HH.mm.ssв имени файла
Perl парсер
После успешной загрузки автоматически запускается Perl парсер для обработки файлов тестирования (совместимость с v1).
Логирование
- Детальные логи в
/upload/<username>/log/ - Центральный лог в
/log/upload.log - Логи ошибок с timestamp
3.3.10. Примеры использования
Android/Kotlin (Multipart)
val client = OkHttpClient()
val requestBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("upload_file", "test.rta",
File("test.rta").asRequestBody("application/octet-stream".toMediaType()))
.build()
val request = Request.Builder()
.url("https://api.batterywizard.ru/api/v2/upload.php")
.addHeader("Authorization", "Bearer $token")
.post(requestBody)
.build()
iOS/Swift (URLSession)
let boundary = "Boundary-\(UUID().uuidString)"
var request = URLRequest(url: URL(string: "https://api.batterywizard.ru/api/v2/upload.php")!)
request.httpMethod = "POST"
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let body = createMultipartBody(fileUrl: fileUrl, boundary: boundary)
request.httpBody = body
Python (Requests)
import requests
url = "https://api.batterywizard.ru/api/v2/upload.php"
headers = {"Authorization": f"Bearer {token}"}
files = {"upload_file": open("test.rta", "rb")}
response = requests.post(url, headers=headers, files=files)
3.3.11. Миграция с v1 на v2
Для аутентификации:
✅ Изменений не требуется — существующий код продолжит работать
Для загрузки файлов:
✅ Изменений не требуется — существующий код продолжит работать
Рекомендуемые улучшения:
- Использовать Bearer Token в заголовках
- Добавить параметры
uuid,os,versionв аутентификацию - Использовать multipart/form-data для загрузки файлов
Эта инструкция обеспечивает полную совместимость с существующими приложениями while предоставляя улучшенную безопасность и функциональность API v2.
