Web Controllers y APIs Externas en Odoo
Odoo permite tanto exponer endpoints web y APIs REST/JSON mediante controladores (http.Controller), como interactuar de forma externa a través de protocolos RPC o consumir servicios de terceros mediante peticiones HTTP.
1. Creación de Controladores Web (http.Controller) #
Para crear rutas web accesibles desde el navegador o por clientes HTTP:
1from odoo import http 2from odoo.http import request 3 4class LibraryWebController(http.Controller): 5 6 # 1. Endpoint público que devuelve JSON 7 @http.route('/api/v1/books', type='json', auth='public', methods=['POST'], csrf=False) 8 def get_books_api(self, **kwargs): 9 books = request.env['library.book'].sudo().search_read( 10 [('is_available', '=', True)], 11 ['name', 'author', 'price'] 12 ) 13 return {'status': 'success', 'data': books} 14 15 # 2. Endpoint que renderiza una página HTML con plantilla QWeb 16 @http.route('/catalogo', type='http', auth='public', website=True) 17 def render_catalog_page(self, **kwargs): 18 books = request.env['library.book'].sudo().search([]) 19 return request.render('biblioteca.catalog_page_template', { 20 'books': books, 21 })
2. Consumo de Servicios y APIs Externas desde Odoo #
Para conectar Odoo con pasarelas de pago, servicios de mensajería o servicios meteorológicos, se utiliza la librería estándar requests:
1import requests 2from odoo import models, fields 3from odoo.exceptions import UserError 4 5class CurrencyExchangeService(models.AbstractModel): 6 _name = 'currency.exchange.service' 7 _description = 'Servicio de Tipos de Cambio' 8 9 def fetch_latest_rates(self): 10 url = "https://api.exchangerate.host/latest?base=EUR" 11 try: 12 response = requests.get(url, timeout=10) 13 response.raise_for_status() 14 data = response.json() 15 return data.get('rates', {}) 16 except requests.exceptions.RequestException as e: 17 raise UserError(f"Error al conectar con el servicio de divisas: {str(e)}")
3. Acceso Externo a Odoo mediante JSON-RPC / XML-RPC #
Cualquier aplicación externa (móvil, frontend React, script Python) puede comunicarse con los modelos de Odoo a través de su endpoint nativo /jsonrpc:
1import requests 2 3url = 'http://localhost:8069/jsonrpc' 4db = 'mi_base_datos' 5username = 'admin' 6password = 'admin_password' 7 8 # 1. Autenticación y obtención del user_id (UID) 9auth_payload = { 10 "jsonrpc": "2.0", 11 "method": "call", 12 "params": { 13 "service": "common", 14 "method": "authenticate", 15 "args": [db, username, password, {}] 16 }, 17 "id": 1 18} 19uid = requests.post(url, json=auth_payload).json()['result'] 20 21 # 2. Consulta de registros (search_read) 22read_payload = { 23 "jsonrpc": "2.0", 24 "method": "call", 25 "params": { 26 "service": "object", 27 "method": "execute_kw", 28 "args": [ 29 db, uid, password, 30 'library.book', 'search_read', 31 [[('is_available', '=', True)]], 32 {'fields': ['name', 'author', 'price'], 'limit': 10} 33 ] 34 }, 35 "id": 2 36} 37books = requests.post(url, json=read_payload).json()['result'] 38print(books)
Resumen del tema
Conceptos clave #
- Controladores Web (
http.Controller): clases para atender peticiones HTTP y endpoints REST/JSON decorados con@http.route. - Parámetros de
@http.route:auth: nivel de autenticación ('public','user','none').type: formato del payload ('http'para HTML o'json'para APIs JSON-RPC).website=True: integración con el motor de plantillas web y renderizado (request.render).
- Integraciones Bidireccionales:
- Consumir APIs externas: uso de la librería Python
requestscon control de excepciones y timeouts. - Exponer APIs vía JSON-RPC: endpoints nativos
/jsonrpcpara interactuar remotamente con modelos mediantesearch_read,create,writey autenticación segura.
- Consumir APIs externas: uso de la librería Python
Qué debes recordar #
Usa http.Controller y @http.route para crear endpoints web personalizados en Odoo, y los servicios JSON-RPC nativos para comunicación máquina a máquina.