En este lab aprenderás como realizar una solicitud http desde oracle apex, este método se puede implementar desde una function, un procedimiento almacenado o bien en la misma ejecución de un botón.

Esta prueba se realizó en un ambiente on premise, por lo que se tenía acceso a la base de datos, en caso de quererlo probar en oracle.apex.com por ejemplo, no será posible realizar la solución.


Acl para lograr el funcionamiento:


Debemos tener en cuenta que primeramente se debe crear un ACL a nivel de la base de datos que nos permita la comunicación con otros hosts.

Siempre debemos asegurarnos de tener los permisos connect y resolve en nuestro acl.

Este proceso puede variar entre las diferentes versiones de bases de datos, sin embargo como una ayuda dejaré un ejemplo de como se hace en cada base de datos Oracle 11g, 12c y 18c:

Oracle 11g:

 

BEGIN

    DBMS_NETWORK_acl_ADMIN.CREATE_ACL(

                                      acl => 'emmax_utl_mail.xml',

                                      description => 'acl para esquema pruebas',

                                      principal => 'PRUEBAS',

                                      is_grant => true,

                                      privilege => 'connect'

                                     );

    DBMS_NETWORK_acl_ADMIN.ADD_PRIVILEGE(

                                         acl => 'emmax_utl_mail.xml',

                                         principal => 'PRUEBAS',

                                         is_grant => true,

                                         privilege => 'resolve'

                                        );

    DBMS_NETWORK_acl_ADMIN.ASSIGN_ACL(

                                      acl => 'emmax_utl_mail.xml',

                                      host => '*'

                                     );

    COMMIT;




END;



Oracle 12c:


BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',
        ace => xs$ace_type(privilege_list => xs$name_list('connect'),
                           principal_name => 'PRUEBAS',
                           principal_type => xs_acl.ptype_db));
END;
/

BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => 'localhost',
        ace => xs$ace_type(privilege_list => xs$name_list('resolve'),
                           principal_name => 'PRUEBAS',
                           principal_type => xs_acl.ptype_db));

END;

Oracle 18c:


BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',
        ace => xs$ace_type(privilege_list => xs$name_list('connect'),
                           principal_name => 'PRUEBAS',
                           principal_type => xs_acl.ptype_db));
END;
/

BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',
 lower_port => '100',
 upper_port => '9999',
        ace => xs$ace_type(privilege_list => xs$name_list('resolve'),
                           principal_name => 'PRUEBAS',
                           principal_type => xs_acl.ptype_db));

END;

Script de envío de request:


Una vez realizada la configuración, ya podemos crear una function, store procedure, trigger, entre otros, que nos permita ejecutar el siguiente script.

Este script realiza el proceso de envío por medio de GET hacía el url que le coloquemos en la variable l_url.

begin
declare
     l_url   varchar2(600);
     l_req   utl_http.req;
     l_resp  utl_http.resp;
     l_text  varchar2(32767);
   begin
    l_url := 'http://192.168.1.4:8282/Servidor_Correos-1.0/Correos_Panda?destinatario=emmanuelguzman96@gmail.com';
   
     l_req  := utl_http.begin_request(l_url);
     l_resp := utl_http.get_response(l_req);

     -- loop para procesar datos recibidos
     begin
       loop
         utl_http.read_text(l_resp, l_text, 32766);
         --dbms_output.put_line(l_text); --Procesamos los mensajes recibidos
       end loop;
     exception
       when utl_http.end_of_body then
         utl_http.end_response(l_resp); -- Disparamos una exception en caso de error de procesamiento
     end;
   end;

end;


En la parte de "Procesamos los mensajes recibidos" podemos asignar esta variable a una respuesta de usuario para hacer procesos interactivos, ya queda a nuestra creatividad, en este caso mi request envía un correo hacía el url que le coloqué, el parámetro envíado es emmanuelguzman96@gmail.com.

Implementando este script podremos realizar solicitudes http con otros servicios externos y procesar la información recibida de la forma en que lo necesitemos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.