Инструкция по использованию API v2 Battery Wizard

Оглавление
  1. 1. Руководство для пользователей мобильных приложений
  2. 2. Руководство для разработчиков
  3. 3. Переход с API v1 на V2

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) — детальная информация

Алгоритм поиска:

  1. Построение фильтра доступа
  2. Парсинг поискового запроса
  3. Построение условий поиска по множеству полей
  4. Форматирование результатов

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

Функцияv1v2
Формат запросаТолько POST данныеPOST данные + JSON
Параметрыlogin, password, apilogin/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Альтернатива loginv2
passwordДаStringПароль пользователяv1 + v2
apiДаStringВерсия APIv1 + 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Код ответаСообщениеОписание
400400Missing required parametersОтсутствуют обязательные параметры
403403Invalid credentialsНеверный логин или пароль
403403API version requiredОтсутствует параметр api
500500Internal 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Код ответаСообщениеПричина
400400No file content providedНе передан файл
403403Token requiredОтсутствует токен
403403Invalid or expired tokenНеверный токен
403403Invalid file sizeНеверный размер файла
403403File extension ‘X’ not allowedЗапрещенное расширение
403403File type ‘X’ not allowedЗапрещенный MIME тип
500500Internal 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

Для аутентификации:

Изменений не требуется — существующий код продолжит работать

Для загрузки файлов:

Изменений не требуется — существующий код продолжит работать

Рекомендуемые улучшения:
  1. Использовать Bearer Token в заголовках
  2. Добавить параметры uuid, os, version в аутентификацию
  3. Использовать multipart/form-data для загрузки файлов

Эта инструкция обеспечивает полную совместимость с существующими приложениями while предоставляя улучшенную безопасность и функциональность API v2.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх