Блог

Как создать REST-контроллеры в Odoo 19

post-title

Создание надежных API имеет важное значение для бесшовной интеграции между бизнес-приложениями. Odoo 19, ведущая платформа ERP с открытым исходным кодом, предоставляет мощные возможности для создания REST-контроллеров, позволяющих внешним системам взаимодействовать с вашим экземпляром Odoo. Это подробное руководство проведет вас через процесс создания и внедрения REST-контроллеров в Odoo 19, от базовой настройки до обработки различных сценариев аутентификации.

Введение

REST-контроллеры в Odoo 19 позволяют предоставлять доступ к бизнес-логике через HTTP-конечные точки, что дает возможность сторонним приложениям получать доступ к данным в вашей системе Odoo и управлять ими. Независимо от того, нужно ли вам интегрироваться с мобильными приложениями, внешними сервисами или пользовательскими панелями мониторинга, REST-контроллеры предоставляют гибкое и масштабируемое решение. Следуя этому руководству, вы узнаете, как создавать эффективные REST-контроллеры, управлять аутентификацией и создавать надежные API-конечные точки.

Шаг 1: Импорт необходимых модулей

Для начала создания REST-контроллеров в Odoo 19 вам потребуется импортировать необходимые модули Python. Начните с основных зависимостей для обработки HTTP-запросов и данных JSON:

from odoo import http 
from odoo.http import request 
import json

Модуль http предоставляет основу для контроллера, модуль request позволяет получать доступ к данным входящих запросов, а модуль json дает возможность работать с JSON-данными. Эти модули являются основополагающими для создания REST-конечных точек в Odoo 19.

Шаг 2: Определите класс контроллера.

Создайте класс Python, наследующий от http.Controller . Этот класс послужит основой для ваших REST-эндпоинтов и будет содержать все обработчики маршрутов для вашего API .

class MyRestController(http.Controller): 
   """ 
   REST-контроллер для обработки API-запросов в Odoo 19. 
   Этот контроллер управляет различными конечными точками API для обработки данных. 
   """ 
   pass

Класс контроллера выступает в качестве контейнера для всех ваших маршрутов и методов API. Вы можете определить несколько маршрутов в рамках одного класса контроллера, логически организуя ваши конечные точки API.

Шаг 3: Создание маршрутов API с помощью декораторов

В Odoo 19 маршруты определяются с помощью декоратора `@http.route()` . Этот декоратор указывает URL-адрес конечной точки, тип запроса и метод аутентификации. Вот как можно структурировать базовый маршрут:

@http.route('/api/v1/endpoint', type='jsonrpc', auth='public') 
def my_api_endpoint(self, **kwargs): 
   """ 
   Конечная точка API для обработки запросов. 
   """
   return {'status': 'success', 'message': 'Достигнута конечная точка API'}

Параметр type='jsonrpc' указывает, что запрос и ответ будут в формате JSON. Параметр auth определяет, требуется ли аутентификация. Эти параметры имеют решающее значение для определения поведения вашей конечной точки.

Шаг 4: Обработка параметров запроса

Для работы с входящими данными запроса в ваших API-интерфейсах используйте объект запроса, предоставляемый Odoo. Параметры запроса можно получить из аргументов kwargs или непосредственно из объекта запроса:

@http.route('/api/v1/data', type='jsonrpc', auth='user', methods=['POST']) 
def process_data(self, **kwargs): 
   """ 
   Обработка входящих данных запроса. 
   """ 
   data = request.get_json_data() 
   name = data.get('name') 
   email = data.get('email') 

   return { 
       'status': 'success', 
       'received': { 
           'name': name, 
           'email': email 
       } 
   }

Объект request.get_json_data() содержит разобранные JSON-данные из входящего запроса. Это позволяет извлекать и обрабатывать параметры, отправляемые клиентскими приложениями.

Два сценария использования REST-контроллеров в Odoo 19

Odoo 19 поддерживает два основных сценария аутентификации для REST-контроллеров: аутентифицированные конечные точки, требующие входа пользователя, и общедоступные конечные точки, доступные без аутентификации. Выбор подхода зависит от ваших требований к безопасности и сценария использования.

Вариант 1: С аутентификацией (auth='user')

В этом сценарии конечная точка REST-контроллера требует от пользователей аутентификации перед доступом к API. Это гарантирует, что только авторизованные пользователи смогут взаимодействовать с конфиденциальными бизнес-данными.

Прежде чем обращаться к какой-либо аутентифицированной конечной точке при использовании внешних приложений (например, скриптов, мобильных приложений или интеграций), необходимо сначала получить действительную сессию, пройдя аутентификацию. Выполните следующие шаги:

  1. Отправьте запрос на аутентификацию по адресу /web/session/authenticate, указав имя вашей базы данных, имя пользователя и пароль.
  2. Используйте сессионный cookie для всех последующих вызовов API.

После аутентификации следует добавлять сессионный cookie-файл к каждому запросу.

При создании защищенных REST API в Odoo аутентификация имеет решающее значение для защиты конфиденциальных данных и обеспечения доступа к вашим конечным точкам только для авторизованных пользователей. В этом руководстве показано, как создавать аутентифицированные конечные точки API, требующие действительных пользовательских сессий.

Шаг 1: Настройка аутентифицированных маршрутов

 

При создании аутентифицированных конечных точек используйте параметр auth='user '. Это ограничит доступ только для авторизованных пользователей:

@http.route('/api/v1/products', type='jsonrpc', auth='user', methods=['GET', 'POST']) 
def manage_products(self, **kwargs): 
   """ 
   Аутентифицированная конечная точка для управления продуктами. 
   Доступна только авторизованным пользователям. 
   """ 
   if request.httprequest.method == 'GET': 
       return self._get_products() 
   elif request.httprequest.method == 'POST': 
       return self._create_product()

Параметр auth ='user' гарантирует, что Odoo проверит сессию пользователя, прежде чем разрешить доступ к этой конечной точке. Если пользователь не аутентифицирован, Odoo вернет ошибку аутентификации.

Шаг 2: Реализация обработчиков аутентифицированных запросов

Разработайте логику для обработки аутентифицированных запросов. Вы можете получить доступ к текущему пользователю через объект запроса и выполнять операции от его имени:

Извлечение товаров из Odoo

Функция _get_products извлекает все товары из модели product.template в Odoo и возвращает их в структурированном формате JSON:

def _get_products(self): 
   """Получить товары для аутентифицированного пользователя.""" 
   try: 
       user = request.env.user 
       products = request.env['product.template'].search([]) 
       product_data = [{ 
           'id': product.id, 
           'name': product.name, 
           'price': product.list_price, 
       } for product in products] 

       return { 
           'status': 'success', 
           'user': user.name, 
           'products': product_data 
       } 

   except Exception as e: 
       return { 
           'status': 'error', 
           'message': str(e) 
       }

Создание продуктов в Odoo

Функция _create_product создает новую запись о товаре в системе учета запасов Odoo :

def _create_product(self): 
   """ 
   Создает новый продукт в каталоге товаров Odoo. 
   Эта функция проверяет входные данные и создает новую запись product.template 
   с предоставленными данными, такими как название, цена, тип, описание и т. д. 
   """ 
   data = request.get_json_data() 
   try: 
       product_data = data.get('params') 
       user = request.env.user 
       if not product_data.get('name'): 
           return { 
               'status': 'error', 
               'message': 'Название продукта обязательно' 
           } 

       product = request.env['product.template'].create({ 
           'name': product_data.get('name'), 
           'list_price': product_data.get('price', 0.0), 
           'type': product_data.get('type', 'consu'), 
           'description': product_data.get('description', ''), 
           'default_code': product_data.get('default_code', ''), 
       }) 

       return { 
           'status': 'success', 
           'message': 'Продукт успешно создан', 
           'product_id': product.id, 
           'product_name': product.name, 
           'created_by': user.name 
       } 

   except Exception as e: 
       return { 
           'status': 'error', 
           'message': f'Не удалось создать продукт: {str(e)}' 
       }

Вариант 2: Без аутентификации (auth='public')

В этом сценарии конечная точка REST-контроллера общедоступна и не требует аутентификации пользователя. Используйте этот подход для конечных точек, предоставляющих общую информацию или услуги, не связанные с конфиденциальными данными.

@http.route('/api/v1/products', type='jsonrpc', auth='public', methods=['GET', 'POST']) 
def manage_products(self, **kwargs): 
   """ 
   Аутентифицированная конечная точка для управления продуктами. 
   Доступна только авторизованным пользователям. 
   """ 
   if request.httprequest.method == 'GET': 
       return self._get_products() 
   elif request.httprequest.method == 'POST': 
       return self._create_product()

Заключение

Теперь вы понимаете, как создавать REST-контроллеры в Odoo 19 для предоставления доступа к вашей бизнес-логике через HTTP API. Следуя шагам, описанным в этом руководстве, вы можете создавать аутентифицированные конечные точки для конфиденциальных операций и публичные конечные точки для обмена общей информацией. REST-контроллеры предоставляют мощный механизм для интеграции Odoo с внешними приложениями, обеспечивая синхронизацию данных в реальном времени, бэкэнды мобильных приложений и интеграцию со сторонними сервисами. Выбор между аутентифицированными и публичными конечными точками зависит от ваших конкретных требований к безопасности и сценария использования. Используйте гибкость фреймворка REST-контроллеров Odoo 19 для создания масштабируемых и поддерживаемых API, которые будут способствовать развитию вашего бизнеса.