#Consumir una API REST y procesar JSON con Delphi
Las aplicaciones de escritorio actuales no funcionan necesariamente de forma aislada. Es habitual que necesiten comunicarse con servicios externos, consultar una API o procesar información recibida en formato JSON.
En este #DelphiTip 03 se desarrolla una pequeña aplicación VCL que realiza una petición HTTP GET, comprueba la respuesta del servidor y transforma el JSON recibido en información utilizable desde Delphi.
Objetivo del ejemplo
La aplicación dispone de un botón denominado Consultar API. Al pulsarlo se realiza una petición a una API REST de demostración y se obtienen los datos de un usuario.
Para realizar las pruebas se utiliza JSONPlaceholder, un servicio REST destinado a proporcionar datos ficticios para ejemplos y prototipos (JSONPlaceholder, s. f.).
Realizar una petición HTTP desde Delphi
Delphi proporciona la clase THTTPClient dentro de
System.Net.HttpClient.
Se crea el cliente HTTP y se realiza una petición GET:
Cliente := THTTPClient.Create;
try
Respuesta := Cliente.Get(API_URL);
finally
Cliente.Free;
end;
El método Get envía una petición HTTP GET a la URL indicada
y devuelve la respuesta mediante IHTTPResponse
(Embarcadero Technologies, s. f.-a).
Comprobar el código HTTP
No se debe asumir que una petición se realiza siempre correctamente. Por ello, se comprueba el código HTTP recibido:
if (Respuesta.StatusCode < 200) or
(Respuesta.StatusCode >= 300) then
begin
raise Exception.CreateFmt(
'La API devuelve el código HTTP %d.',
[Respuesta.StatusCode]
);
end;
De esta forma, la aplicación diferencia una respuesta satisfactoria de una respuesta HTTP que indica un problema.
Obtener el JSON
Cuando la respuesta resulta satisfactoria se obtiene su contenido:
TextoJSON :=
Respuesta.ContentAsString(TEncoding.UTF8);
La respuesta utilizada en el ejemplo contiene información estructurada en JSON. Una versión simplificada presenta esta forma:
{
"id": 1,
"name": "Leanne Graham",
"email": "Sincere@april.biz"
}
Convertir el texto en un objeto JSON
Recibir el texto no resulta suficiente si se desean utilizar sus campos
individualmente. Para ello se analiza mediante las clases disponibles
en System.JSON.
ValorJSON :=
TJSONObject.ParseJSONValue(AJSON);
TJSONObject implementa un objeto JSON y las funciones de
análisis permiten transformar los datos recibidos en valores JSON que
pueden manipularse desde Delphi (Embarcadero Technologies, s. f.-b).
Extraer los datos
Una vez comprobado que se obtiene un TJSONObject, se recuperan
los valores necesarios:
lblId.Caption :=
'ID: ' +
ObjetoJSON.GetValue<Integer>('id').ToString;
lblNombre.Caption :=
'Usuario: ' +
ObjetoJSON.GetValue<string>('name');
lblEmail.Caption :=
'Email: ' +
ObjetoJSON.GetValue<string>('email');
La interfaz VCL deja así de trabajar con una cadena JSON completa y pasa a utilizar los valores individuales recibidos desde el servicio.
Control de errores
La comunicación de red y el procesamiento del JSON se realizan dentro de bloques de gestión de excepciones.
try
Respuesta := Cliente.Get(API_URL);
// Procesamiento de la respuesta
except
on E: Exception do
begin
lblEstado.Caption := 'Error';
ShowMessage(
'No se puede completar la consulta:' +
sLineBreak + E.Message
);
end;
end;
De esta manera se contemplan situaciones como problemas de conexión, respuestas HTTP incorrectas o datos que no presentan la estructura esperada.
¿Qué se practica?
- Comunicación HTTP desde Delphi.
- Consumo de servicios REST.
- Peticiones HTTP GET.
- Comprobación de códigos de estado HTTP.
- Procesamiento de JSON.
- Uso de
THTTPClient. - Uso de
TJSONObject. - Gestión de excepciones.
- Integración de servicios externos en aplicaciones VCL.
Evolución del ejemplo
Este proyecto se mantiene deliberadamente pequeño para estudiar la comunicación REST y JSON de forma aislada. Posteriormente puede combinarse con ejecución en segundo plano, logging, bases de datos y una arquitectura con mayor separación entre interfaz y servicios.
El código fuente se publica en el repositorio
DelphiHeaven-Tips, dentro de
Tip03-REST-JSON.
DelphiHeaven & InformatOLI — Delphi y Object Pascal con ejemplos prácticos.
Referencias
Embarcadero Technologies. (s. f.-a). System.Net.HttpClient.THTTPClient.Get. RAD Studio API Documentation. https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Net.HttpClient.THTTPClient.Get
Embarcadero Technologies. (s. f.-b). System.JSON.TJSONObject. RAD Studio API Documentation. https://docwiki.embarcadero.com/Libraries/Athens/en/System.JSON.TJSONObject
JSONPlaceholder. (s. f.). JSONPlaceholder: Free fake and reliable API for testing and prototyping. https://jsonplaceholder.typicode.com/
