Webinar Crea reportes y formularios basados en web services
En este post encontrarás toda la información utilizada durante nuestro webinar ‘Crea reportes y formularios basados en web services’. Este recurso está diseñado para ayudarte a entender y replicar los conceptos presentados durante la sesión.
Si no pudiste asistir o quieres repasar lo aprendido, aquí tendrás acceso a los ejemplos y explicaciones detalladas para que puedas aprovechar al máximo las posibilidades de los servicios web.
¡Espero que lo encuentres útil y si tienes preguntas, no dudes en dejarlas en los comentarios!
Primer paso es crear las tablas con la información demo para el ejemplo.
-- Tabla: facturas
CREATE TABLE facturas (
factura_id NUMBER PRIMARY KEY,
fecha_factura DATE NOT NULL,
monto NUMBER(10, 2) NOT NULL,
estado_pago_id NUMBER NOT NULL,
orden_compra_id NUMBER NOT NULL
);
-- Tabla: ordenes_de_compra
CREATE TABLE ordenes_de_compra (
orden_compra_id NUMBER PRIMARY KEY,
fecha_orden DATE NOT NULL,
proveedor VARCHAR2(100) NOT NULL,
total_monto NUMBER(10, 2) NOT NULL
);
-- Tabla: estados_de_pago
CREATE TABLE estados_de_pago (
estado_pago_id NUMBER PRIMARY KEY,
estado_descripcion VARCHAR2(50) NOT NULL
);
-- Insertar datos dummy en estados_de_pago
INSERT INTO estados_de_pago (estado_pago_id, estado_descripcion)
VALUES (1, 'Pagado');
INSERT INTO estados_de_pago (estado_pago_id, estado_descripcion)
VALUES (2, 'Pendiente');
INSERT INTO estados_de_pago (estado_pago_id, estado_descripcion)
VALUES (3, 'Cancelado');
/
-- insertar dummy en ordenes de compra
BEGIN
FOR i IN 1..50 LOOP
INSERT INTO ordenes_de_compra (orden_compra_id, fecha_orden, proveedor, total_monto)
VALUES (
i,
SYSDATE - DBMS_RANDOM.VALUE(1, 365),
'Proveedor ' || i,
ROUND(DBMS_RANDOM.VALUE(1000, 5000), 2)
);
END LOOP;
END;
/
-- Insertar datos dummy en facturas
BEGIN
FOR i IN 1..50 LOOP
INSERT INTO facturas (factura_id, fecha_factura, monto, estado_pago_id, orden_compra_id)
VALUES (
i,
SYSDATE - DBMS_RANDOM.VALUE(1, 365),
ROUND(DBMS_RANDOM.VALUE(500, 3000), 2),
MOD(i, 3) + 1,
MOD(i, 50) + 1
);
END LOOP;
END;
/
-- Confirmar cambios
COMMIT;
Otorgamos acceso a nuestro esquema para que pueda publicar web services con ords


Este es el código para crear los Modulos -> Templates -> Handlers
-- Generated by ORDS REST Data Services 23.4.0.r3461619
-- Schema: WEBINAR_WEBSERVICES Date: Sun Dec 01 05:07:03 2024
--
BEGIN
ORDS.ENABLE_SCHEMA(
p_enabled => TRUE,
p_schema => 'WEBINAR_WEBSERVICES',
p_url_mapping_type => 'BASE_PATH',
p_url_mapping_pattern => 'webinar',
p_auto_rest_auth => FALSE);
ORDS.DEFINE_MODULE(
p_module_name => 'webinar',
p_base_path => '/webinar/',
p_items_per_page => 0,
p_status => 'PUBLISHED',
p_comments => NULL);
ORDS.DEFINE_TEMPLATE(
p_module_name => 'webinar',
p_pattern => 'facturas',
p_priority => 0,
p_etag_type => 'HASH',
p_etag_query => NULL,
p_comments => NULL);
ORDS.DEFINE_HANDLER(
p_module_name => 'webinar',
p_pattern => 'facturas',
p_method => 'GET',
p_source_type => 'json/collection',
p_mimes_allowed => NULL,
p_comments => NULL,
p_source =>
'select * from facturas');
ORDS.DEFINE_TEMPLATE(
p_module_name => 'webinar',
p_pattern => 'ordenes',
p_priority => 0,
p_etag_type => 'HASH',
p_etag_query => NULL,
p_comments => NULL);
ORDS.DEFINE_HANDLER(
p_module_name => 'webinar',
p_pattern => 'ordenes',
p_method => 'GET',
p_source_type => 'json/collection',
p_mimes_allowed => NULL,
p_comments => NULL,
p_source =>
'select * from ordenes_de_compra');
ORDS.DEFINE_TEMPLATE(
p_module_name => 'webinar',
p_pattern => 'estados-pago',
p_priority => 0,
p_etag_type => 'HASH',
p_etag_query => NULL,
p_comments => NULL);
ORDS.DEFINE_HANDLER(
p_module_name => 'webinar',
p_pattern => 'estados-pago',
p_method => 'GET',
p_source_type => 'json/collection',
p_mimes_allowed => NULL,
p_comments => NULL,
p_source =>
'select * from estados_de_pago');
COMMIT;
END;
Con el siguiente código, implementaremos una capa de protección para todos los endpoints que contengan el texto /webinar/*. Esto significa que cualquier ruta que comience con este patrón quedará asegurada, abarcando así todos los endpoints que hemos desarrollado hasta ahora. Esto garantiza que solo usuarios o sistemas autorizados puedan acceder a estas rutas, brindando mayor seguridad a nuestra aplicación.
BEGIN
ORDS.create_role(
p_role_name => 'webinar'
);
END;
/
BEGIN
OAUTH.create_client(
p_name => 'webinar_client',
p_grant_type => 'client_credentials',
p_owner => 'webinar_webservices',
p_description => 'Cliente para acceder a los datos',
p_support_email => 'contacto@aprendiz.academy',
p_privilege_names => 'webinar'
);
COMMIT;
END;
/
BEGIN
oauth.grant_client_role(p_client_name => 'webinar_client',
p_role_name => 'webinar');
COMMIT;
END;
/
DECLARE
l_roles_arr OWA.vc_arr;
l_patterns_arr OWA.vc_arr;
BEGIN
l_roles_arr(1) := 'webinar';
l_patterns_arr(1) := '/webinar/*';
ORDS.define_privilege (
p_privilege_name => 'portalproveedores',
p_roles => l_roles_arr,
p_patterns => l_patterns_arr,
p_label => 'webinar_webservices',
p_description => 'Proteger todos los endpoints con '
);
END;
/
Para obtener el cliente y la contraseña necesarios para la autenticación, simplemente debemos ejecutar la siguiente consulta SQL. Esta consulta está diseñada para recuperar los valores específicos de las columnas correspondientes en la base de datos, asegurando que tengamos la información correcta para continuar con el proceso.
Es importante mencionar que estos datos deben ser manejados con cuidado, ya que contienen información sensible que puede estar relacionada con el acceso a sistemas o servicios. A continuación, se presenta el query que nos permitirá realizar esta operación de manera eficiente y segura
select * from user_ords_clients

Probamos en Postman y confirmamos que el mecanismo de autenticación funciona correctamente.


La respuesta se debe ver así
{
"items": [
{
"estado_pago_id": 1,
"estado_descripcion": "Pagado"
},
{
"estado_pago_id": 2,
"estado_descripcion": "Pendiente"
},
{
"estado_pago_id": 3,
"estado_descripcion": "Cancelado"
}
],
"hasMore": false,
"limit": 0,
"offset": 0,
"count": 3,
"links": [
{
"rel": "self",
"href": "https://app.aprendiz.academy/ords/aprendizdev/webinar/webinar/estados-pago"
},
{
"rel": "describedby",
"href": "https://app.aprendiz.academy/ords/aprendizdev/webinar/metadata-catalog/webinar/item"
}
]
}
Ahora vamos a consumir los datos desde APEX Autonomous Database en Oracle Cloud

Terminar de ver la implementación en el siguiente video
Aplicación para consumir web services funcionando
Error corregido, revisa que la fecha no venga en el formato “#FECHA_FACTURA#”, más bien debe de ser sin comillas dobles como se ve en el ejemplo de abajo 😁
{
"monto":"#MONTO#"
,"fecha_factura":#FECHA_FACTURA#
,"estado_pago_id":"#ESTADO_PAGO_ID#"
,"orden_compra_id":"#ORDEN_COMPRA_ID#"
}

Social List