CRM4DEV-799 - Получение подробных данных проблемы... СТАТУС

📄 Описание HTTP-методов: serviceGET и servicePOST

1. Общее назначение

Функции serviceGET и servicePOST — это точки входа REST API для работы с сервисами и внешними пользователями. Они позволяют:

  • Получать список доступных сервисов.
  • Управлять лицензиями.
  • Изменять данные внешних пользователей.

🔐 Все методы требуют аутентификации и работают в рамках системы авторизации через ОбщегоНазначенияHTTPСервисы.


2. Маршрутизация

МетодURLНазначение
GET/rest/service?ИмяМетода=list_appПолучить список сервисов
GET/rest/service?ИмяМетода=many_licensesПолучить количество лицензий
POST/rest/service?ИмяМетода=change_userИзменить данные внешнего пользователя

3. Функция: serviceGET(Запрос)

🔹 Назначение

Обработка GET-запросов к ресурсу /rest/service для получения информации о сервисах и лицензиях.

🔹 Алгоритм работы

Функция serviceGET(Запрос)
    ИмяМетода = Запрос.ПараметрыURL["ИмяМетода"];
    
    // Особая проверка для list_app (возможно, упрощённая авторизация)
    Если ИмяМетода = "list_app" Тогда
        РезультатПроверки = ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации(Запрос, Истина);
    Иначе
        РезультатПроверки = ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации(Запрос,,,Истина);
    КонецЕсли;
    
    Если Не РезультатПроверки.Успешно Тогда
        // Ответ 405 при ошибке авторизации
        ТелоОтвета = RestAPI_Методы.СтрокаОтвета(Неопределено, Ложь, РезультатПроверки.Ошибка);
        Ответ = Новый HTTPСервисОтвет(405);
        Ответ.УстановитьТелоИзСтроки(ТелоОтвета);
        Возврат Ответ;
    КонецЕсли;
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    
    Если ИмяМетода = "list_app" Тогда
        Ответ = RestAPI_Методы.СписокСервисов(Запрос);
    ИначеЕсли ИмяМетода = "many_licenses" Тогда
        Ответ = RestAPI_Методы.КоличествоЛицензий(Запрос);
    Иначе
        ТелоОтвета = RestAPI_Методы.СтрокаОтвета(Неопределено, Ложь, "Method not found.");
        Ответ.КодСостояния = 404;
        Ответ.УстановитьТелоИзСтроки(ТелоОтвета);
    КонецЕсли;
    
    Возврат Ответ;
КонецФункции

🔹 Поддерживаемые методы

list_app

  • Назначение: Получить список всех доступных сервисов.
  • Авторизация: Полная, но с флагом Истина — возможно, пропускает некоторые проверки.
  • Вызов: RestAPI_Методы.СписокСервисов(Запрос)
  • Пример ответа:
    {
      "success": true,
      "data": [
        {
          "НаименованиеСервиса": "CRM",
          "Права": ["read", "write"]
        },
        {
          "НаименованиеСервиса": "ERP",
          "Права": ["read"]
        }
      ]
    }
    

many_licenses

  • Назначение: Получить количество активных лицензий.
  • Авторизация: Стандартная.
  • Вызов: RestAPI_Методы.КоличествоЛицензий(Запрос)
  • Пример ответа:
    {
      "success": true,
      "data": 150
    }
    

❌ Другие значения ИмяМетода

  • Возвращается ошибка 404 Method not found.

4. Функция: servicePOST(Запрос)

🔹 Назначение

Обработка POST-запросов к ресурсу /rest/service для изменения данных внешних пользователей.

🔹 Алгоритм работы

Функция servicePOST(Запрос)
    ИмяМетода = Запрос.ПараметрыURL["ИмяМетода"];
    
    // Авторизация с флагом "Истина" — возможно, расширенные права
    РезультатПроверки = ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации(Запрос,,,Истина);
    
    Если Не РезультатПроверки.Успешно Тогда
        ТелоОтвета = RestAPI_Методы.СтрокаОтвета(Неопределено, Ложь, РезультатПроверки.Ошибка);
        Ответ = Новый HTTPСервисОтвет(405);
        Ответ.УстановитьТелоИзСтроки(ТелоОтвета);
        Возврат Ответ;
    КонецЕсли;
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    
    Если ИмяМетода = "change_user" Тогда
        Ответ = RestAPI_Методы.ИзменитьВнешнегоПользователя(Запрос);
    Иначе
        ТелоОтвета = RestAPI_Методы.СтрокаОтвета(Неопределено, Ложь, "Method not found.");
        Ответ.КодСостояния = 404;
        Ответ.УстановитьТелоИзСтроки(ТелоОтвета);
    КонецЕсли;
    
    Возврат Ответ;
КонецФункции

🔹 Поддерживаемый метод

change_user

  • Назначение: Изменить данные внешнего пользователя (например, email, имя, права).
  • Авторизация: Расширенная (,,,Истина) — требуется высокий уровень доступа.
  • Вызов: RestAPI_Методы.ИзменитьВнешнегоПользователя(Запрос)
  • Ожидаемый формат тела запроса (JSON):
    {
      "UserID": "123",
      "Email": "new@example.com",
      "ФИО": "Иванов Иван"
    }
    
  • Ответ:
    • 200 OK — успешно.
    • 400 Bad Request — неверный формат.
    • 403 Forbidden — нет прав.

5. Используемые общие модули

МодульФункцияНазначение
ОбщегоНазначенияHTTPСервисыПроверкаАвторизации()Проверка токена, ключа, роли пользователя

ЗаписьВЖурнал()Аудит действий пользователя
RestAPI_МетодыСписокСервисов()Возвращает список сервисов с правами

КоличествоЛицензий()Возвращает число активных лицензий

ИзменитьВнешнегоПользователя()Обновляет данные пользователя

СтрокаОтвета()Формирует JSON-ответ с данными или ошибкой

6. Механизм авторизации

Обе функции используют единый механизм:

РезультатПроверки = ОбщегоНазначенияHTTPСервисы.ПроверкаАвторизации(Запрос, ...);

Он проверяет:

  • Наличие заголовка Authorization (Bearer-токен или Basic Auth).
  • Валидность токена/пароля.
  • Принадлежность пользователя к системе.
  • Наличие необходимых прав.

⚠️ При Истина в последнем параметре — могут разрешаться действия для администраторов или интеграций.


7. Формат ответа

Все методы возвращают JSON в формате:

{
  "success": true,
  "data": { ... },
  "error": ""
}

или при ошибке:

{
  "success": false,
  "data": null,
  "error": "Wrong authorization"
}

Формирование выполняется через:

ТелоОтвета = RestAPI_Методы.СтрокаОтвета(Данные, Успешно, Ошибка);

8. Что уже реализовано

ФункцияРеализованоКомментарий
serviceGETПоддержка list_app, many_licenses
servicePOSTПоддержка change_user
АвторизацияЧерез общий модуль
Формирование JSONЕдиный шаблон ответа
Обработка ошибокПерехват и возврат 405/404
АудитЧерез ЗаписьВЖурнал()

9. Рекомендации по доработке

НаправлениеРекомендация
Добавить OPTIONSРеализовать serviceOPTIONS() для CORS.
Поддержка PATCH/DELETEДля гибкого управления пользователями.
Валидация входных данныхПроверять структуру JSON перед обработкой.
Логирование запросовЗаписывать в ЖурналОбменаAPI.
Кэширование list_appЧтобы снизить нагрузку на БД.
Поддержка пагинацииЕсли список сервисов станет большим.

10. Примеры использования

🔹 Получить список сервисов

GET /rest/service?ИмяМетода=list_app
Authorization: Bearer abc123

🔹 Получить количество лицензий

GET /rest/service?ИмяМетода=many_licenses
Authorization: Bearer abc123

🔹 Изменить пользователя

POST /rest/service?ИмяМетода=change_user
Authorization: Bearer admin_token
Content-Type: application/json

{
  "UserID": "U-789",
  "Email": "updated@company.com",
  "ФИО": "Петров Петр Петрович"
}

11. Заключение

Функции serviceGET и servicePOST — это ключевые точки интеграции для управления сервисами и пользователями. Они:

  • Безопасны (авторизация обязательна).
  • Гибки (расширяемы через ИмяМетода).
  • Хорошо документированы (единый формат ответа).

Документ подготовлен так, чтобы новый программист мог:

  • Понять логику маршрутизации.
  • Безопасно добавить новые методы.
  • Интегрировать с внешними системами.
  • Нет меток