# Agregar fuentes REST en Oracle APEX

En una [publicación pasada](https://hashnode.com/post/clo3upfod000109mo5etv7s0s) les mostraba como crear *endpoints* en la base de datos utilizando **Oracle REST Data Services** (ORDS), los cuales luego pueden ser usados en una aplicación APEX o consumidos desde cualquier aplicación que sea capaz de hacer peticiones REST. En esa oportunidad el origen de los datos era la misma base de datos ¿y si queremos consumir datos de una fuente REST que no sea nuestra base de datos? Hagamos un ejemplo extrayendo los datos de una API que está disponible de manera pública: [Hyrule Compendium API](https://gadhagod.github.io/Hyrule-Compendium-API/#/); la cual tiene información sobre uno de mis juegos favoritos: **The Legend of Zelda: Breath of the Wild**.

## Analizando la API

La primera tarea antes de hacer cualquier cosa en APEX es entender cómo la API nos devuelve la información que vamos a necesitar. Al revisar la documentación en su sitio web vemos que la API tiene de hecho dos componentes:

* *Compendium API*: Sirve la información sobre criaturas, equipos, materiales, monstruos y tesoros.
    
* *Regions API*: Provee información sobre las ocho regiones geográficas de Hyrule. El *Compendium API* tiene varios *endpoints* que devuelven diferentes tipos de datos. Veamos un par de ellos: **Get all entries** y **Get Categories**. Comencemos con **Get all entries** que parece ser el más sencillo dado que no utiliza ningún tipo de parámetro.
    

### Get All Entries

El *endpoint* vendría siendo: `/compendium/all` y la forma de hacer la petición al API sería:

```http
GET https://botw-compendium.herokuapp.com/api/v3/compendium/all
```

Hagamos una petición al *endpoint* para ver cómo sería la respuesta. En mi caso utilicé Insomnia pero pueden utilizar cualquier cliente para hacer la petición.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1731531229827/85a0f274-034d-4d19-b488-1a0f8f33161e.png align="center")

En este extracto podemos ver que la respuesta es un JSON que tiene un arreglo con el nombre `data` que tiene a su vez los objetos con diferentes categorías.

### Get Categories

Este *endpoint* permite obtener la información de los objetos del juego según su categoría, la forma de hacer la petición al API sería la siguiente:

```http
GET https://botw-compendium.herokuapp.com/api/v3/compendium/category/<category>
```

En este caso sí necesitamos enviar un parámetro en el URL que sería la categoría sobre la cual necesitamos la información. Para hacer una petición en Insomnia utilizaremos una variable que colocaremos en el URL.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543176195/4a6d083a-8d2a-49a2-9cd6-dcc40f4e12e7.png align="left")

Podemos ver que en este caso la respuesta también es un objeto que tiene un arreglo identificada como `data` que contiene los datos de los materiales para la categoría solicitada.

Veamos ahora como crear estas fuentes de datos REST en APEX.

## Creando las fuentes de datos

Lo primero que haremos será crear una nueva aplicación, de momento solo la crearemos con la pantalla de Inicio ya que en un principio necesitamos acceso a los *Shared Components*. Este proceso lo pueden seguir desde cualquier instancia donde tenga APEX instalado. En mi caso utilizaré la que se encuentra en [apex.oracle.com](http://apex.oracle.com).

Desde la página inicial de APEX haremos clic en *Create*

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543240552/0eb4d3d6-6095-4e95-8ea0-6d7580bfdf4a.png align="left")

Vamos a darle un nombre a la aplicación y hacemos clic en *Create Application*

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543279727/6a8ade27-e9c2-41c6-a355-41afcc7fbd8f.png align="left")

Una vez en la aplicación ingresaremos a *Shared Components*

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543294763/4a4d184f-de41-4295-bb70-9a5d7a9bafda.png align="left")

Un poco más abajo, en *Data Sources* seleccionaremos *REST Data Sources*

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543308213/dfc8e818-6c9a-41ca-8ce3-244c81fb77d3.png align="center")

En esta sección lo que haremos será definir la forma en que APEX va a comunicarse con los servicios REST de los cuales queremos consumir la información. Luego sería posible utilizar estas fuentes para alimentar elementos como *Interactive Reports* o *Interactive Grids*.

### Creando la fuente para *Get All*

Si no tenemos alguna otra fuente de datos veremos una pantalla similar a la siguiente:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543386301/af936de0-ad3f-4abb-951d-9751021c29dd.png align="left")

Simplemente hagamos clic en *Create* para crear una nueva fuente de datos REST. Nos aparecerá la siguiente pantalla en la cual seleccionaremos *From scratch* (vamos a crear la fuente desde cero) y luego haremos clic en *Next*

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543417140/19261e06-6ed8-4522-8154-2cf231eb3456.png align="left")

En la siguiente pantalla veremos que nos solicita información básica sobre la fuente que vamos a crear, colocaremos la siguiente información:

* REST Data Source Type: Simple HTTP
    
* Name: Hyrule Compendium (o el nombre que ustedes quieran)
    
* URL Endpoint: [https://botw-compendium.herokuapp.com/api/v3/compendium](https://botw-compendium.herokuapp.com/api/v3/compendium) El resto de los campos podemos dejarlos en blanco, luego haremos clic en *Next*
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543435544/cc9b5ae7-f3ca-4e58-a9ef-52e2c708f755.png align="left")

En la siguiente pantalla se nos mostrará que APEX está creando un *Remote Server* que será la base desde la que crearemos el resto de las fuentes REST. Este es un paso que solo se realiza una vez. Dejaremos los datos tal como están y haremos clic en *Next*.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543449806/d8a05624-e364-472b-a31e-ddc19b057cd9.png align="left")

En la siguiente pantalla nos solicitará información sobre la paginación de la fuente, seleccionaremos *No Pagination* y haremos clic en *Next*

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543488148/11829f5f-6b63-4560-912f-3aff3d1b884e.png align="left")

La siguiente pantalla nos solicitará que le indiquemos cómo se hará la autenticación con la fuente de datos, en este caso este servicio no requiere autenticación, por lo que lo dejamos tal como está y hacemos clic en *Advanced*.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543503727/bd8d1b6d-abfc-43c8-8c08-6f238c924adf.png align="left")

Dado que el servicio devuelve un JSON que no está construido específicamente para ser leído por APEX, vamos a ayudarlo a entender su estructura mediante un archivo de respuesta de ejemplo. Desde la aplicación que estén utilizando para evaluar el API, exporten la respuesta luego de haber hecho la solicitud a *All Entries* y guárdenlo en un archivo de texto.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543561627/fab7784b-cbbc-441f-9f80-0de8b54faec6.png align="center")

Volviendo a APEX, en la pantalla *Parameters* modificaremos dos opciones:

* *Discovery Sample*: Allí cargaremos el archivo que exportamos en el paso anterior
    
* *Row Selector*: Le indicaremos la clave dentro del archivo que identifica a la tabla de datos. Recuerden que toda la información está en un arreglo llamado *data* que a su vez es un arreglo de objetos.
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543584667/75b2b89a-70d0-4e41-81a0-fc48dfa5cfdd.png align="left")

Finalmente hagamos clic en *Discover* para verificar que puede leer correctamente el API.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543604943/24f052d5-d797-47cd-899e-fe33b62562b8.png align="left")

En este caso vemos que leyó correctamente el API y fue capaz de identificar el arreglo en el cual se guarda la información. Para finalizar hacemos clic en *Create REST Data Source*.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543781613/bbd64ee0-633d-4d5f-9636-0ac2be17dbe4.png align="left")

Si hacemos clic en el nombre de la fuente podremos ver la información con la que fue creado, así como también tendremos la posibilidad de agregar otras instrucciones REST (como PUT o POST) si el API lo permitiese.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543801549/bfa70f9c-1692-4397-9527-143c0645b203.png align="left")

### Creando la fuente para *Get Category*

Vamos ahora a crear la fuente REST para *Get Category*, este es un poco diferente ya que debemos pasar un parámetro en el URL en el cual le indicamos la categoría que deseamos consultar.

Volvemos a la pantalla donde tenemos la lista de fuentes REST y hacemos clic en *Create* para crear uno nuevo

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543848557/442f9da5-6d04-4ee6-aff8-2f0ef51da572.png align="left")

En la siguiente pantalla seleccionaremos *From scratch* y luego hacemos clic en *Next* hasta llegar a la pantalla donde indicaremos el URL del servicio. Introducimos una descripción y el URL y hacemos clic en *Next*

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543865195/22876943-9c2b-49d5-b486-a5036db2359f.png align="left")

Como el servidor remoto fue creado cuando registramos la primera fuente entonces APEX nos mostrará la información existente. Lo dejamos como está y hacemos clic en *Next*

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543884557/f4544c9c-b05c-40c3-bc9e-9edd412ee27d.png align="left")

En la siguiente página nos solicitará la información sobre paginación, hacemos clic en *Next* sin hacer cambios.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543916722/0ad19b43-e17b-49d2-88c9-0ba90d607f8b.png align="left")

En la siguiente página nos solicitará información sobre el método de autenticación del servicio, lo dejamos desactivado ya que no requiere autenticación y hacemos clic en *Advanced*.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543930530/3df27d81-c92e-43b5-82f6-cbb25f879b83.png align="left")

Esta solicitud es un poco diferente a la anterior ya que requiere que pasemos un parámetro en el URL el cual le indica cuál es la categoría que vamos a consultar. Así que vamos a colocar esa información en la pantalla de parámetros. Al igual que con el caso anterior, vamos a descargar un archivo de respuesta JSON de ejemplo para que APEX pueda crear fácilmente la fuente.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543945673/37a0fd34-5c1d-494c-972c-2c7604a595b5.png align="left")

Finalmente hacemos clic en *Discover* para verificar que la fuente funciona correctamente. Si todo está bien deberíamos ver esta pantalla.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732543973343/a3e07844-19dc-4435-8e37-70f5a1552d3d.png align="left")

Finalmente hacemos clic en *Create REST Data Source*.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732544003793/96f7314c-50d4-449c-b33b-2803cc59aa33.png align="left")

Ahora podemos utilizar estas fuentes de datos en nuestras aplicaciones en cualquier elemento que permita que la fuente de datos sea un REST Data Source, como por ejemplo un Reporte Interactivo

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732544014077/1f2261a3-4f62-4a13-bcfb-35205ad02375.png align="left")

Recuerden de asegurarse que están pasando los parámetros correctos y obtendrán un reporte como este:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1732544024538/1185c8f9-1a09-43bc-84ae-383674e30d6a.png align="left")

Espero que les sea de utilidad.
