Office Address

  • 123/A, Miranda City Prikano
  • +0989 7876 9865 9
  • info@example.com

Social List

Webinar Crea reportes y formularios basados en web services

Lectura: 4 minutos

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#"
}

Post a Comment

Your email address will not be published. Required fields are marked *