Utilizar las diferentes clases HTTP y sus funciones

Completado

Puede acceder a los servicios REST a través de solicitudes HTTP. Para implementar una solicitud HTTP, debe usar un verbo HTTP.

Los siguientes verbos son los verbos más utilizados en los servicios REST:

  • GET (para leer datos)

  • POST (para crear datos)

  • PUT (para actualizar/reemplazar datos)

  • PATCH (para actualizar/modificar datos)

  • DELETE (para eliminar datos)

Clase HttpClient

La clase HttpClient proporciona una clase base para enviar solicitudes HTTP y recibir respuestas HTTP de un recurso identificado por un URI.

  • DefaultRequestHeaders(): obtiene los encabezados de solicitud predeterminados que se deben enviar con cada solicitud.

  • SetBaseAddress(Uri): establece la dirección base del URI que se utiliza al enviar solicitudes.

  • Get(Uri, HttpResponseMessage): envía una solicitud GET para obtener el recurso identificado por el URI de solicitud.

  • Post(Uri, HttpContent, HttpResponseMessage): envía una solicitud POST al URI especificado.

  • Put(Uri, HttpContent, HttpResponseMessage): envía una solicitud PUT al URI especificado.

  • Delete(Uri, HttpContent, HttpResponseMessage): envía una solicitud DELETE al URI especificado.

  • Send(HttpRequestMessage, HttpResponseMessage): envía una solicitud HTTP. En la variable HttpRequestMessage, debe proporcionar el URI y el verbo que se va a usar.

  • Clear(): establece la variable HttpClient en el valor predeterminado.

  • Timeout(): obtiene o establece la duración en segundos que se debe esperar antes de que la solicitud agote el tiempo de espera. El tiempo de espera es un valor entero.

  • AddCertificate(Certificate, Password): agrega un certificado a la clase HttpClient. Debe proporcionar un certificado codificado en base64.

  • UseResponseCookies(UseResponseCookies): cuando esta opción se establece en true, el cliente adjunta automáticamente las cookies que ha recibido de la respuesta a todas las solicitudes siguientes.

Al proporcionar un URI, puede usar dos métodos. El primero consiste en solicitar datos de la siguiente URL:

https://jsonplaceholder.typicode.com/posts

Luego, puede usar SetBaseAddress al usar la clase HttpClient para hacer múltiples solicitudes.

var
    client: HttpClient;
    responseMessage: HttpResponseMessage;
begin 
    client.SetBaseAddress('https://jsonplaceholder.typicode.com/');
    client.Get('posts', responseMessage);
end;

El segundo método se utiliza al solicitar los datos solo una vez. En ese caso, puede poner el URI completo en la función Get.

var
    client: HttpClient;
    responseMessage: HttpResponseMessage;
begin 
    client.Get('https://jsonplaceholder.typicode.com/posts', responseMessage);
end;

Clase HttpHeaders

La clase HttpHeaders contiene una colección de encabezados y sus valores. HttpHeaders se envían con cada solicitud y respuesta, y se utilizan para enviar información adicional sobre la solicitud o cómo el cliente desea que se formatee la respuesta.

Son HttpHeaders comunes Authorization (para enviar credenciales de autenticación), Content-Type (el tipo de medio del cuerpo de la solicitud), User-Agent (la cadena de agente de usuario, el nombre del navegador), Accept-Charset (qué conjuntos de caracteres son aceptables).

Puede obtener HttpHeaders mediante el uso de la propiedad DefaultRequestHeaders de la clase HttpClient.

var
    client: HttpClient;
    headers: HttpHeaders;    
    content: HttpContent;
    responseMessage: HttpResponseMessage;
begin 
    headers := client.DefaultRequestHeaders();
    headers.Add('Content-Type','application-json');
    client.Post('https://jsonplaceholder.typicode.com/posts', content, 
                responseMessage);
end;
  • Add(Key, Value): establece el valor proporcionado para el nombre del encabezado proporcionado.

  • Clear(): establece la variable HttpHeaders en el valor predeterminado.

  • Contains(Key): comprueba si una variable HttpHeaders contiene una propiedad con la clave dada.

  • GetValues(Key, Array of Text): obtiene los valores para la clave especificada. Los valores se devuelven en la matriz de texto.

  • Remove(Key): elimina la clave y los valores relacionados del objeto HttpHeaders.

Clase HttpResponseMessage

La clase HttpResponseMessage representa un mensaje de respuesta HTTP. Un mensaje de respuesta es el resultado de una acción HTTP (Get, Post, Put, Delete). Se devuelve en el parámetro HttpResponseMessage.

var
    client: HttpClient;
    responseMessage: HttpResponseMessage;
begin 
    client.Get('https://jsonplaceholder.typicode.com/posts', responseMessage);
end;
  • Content(): obtiene el contenido (HttpContent) de la respuesta HTTP.

  • Headers(): obtiene los encabezados HTTP de la solicitud HTTP.

  • HttpStatusCode(): obtiene el código de estado de la respuesta HTTP.

  • IsSuccessStatusCode(): obtiene un valor que indica si la respuesta HTTP fue correcta.

  • ReasonPhrase(): obtiene la frase de razón que generalmente se envía junto con el código de estado. Puede usar esta variable para proporcionar al usuario información adicional cuando falla una solicitud.

Códigos de error de estado HTTP comunes

Cuando se llama a un punto de conexión de servicio web, la respuesta siempre incluye un código de estado HTTP. Puede recuperarlo en AL llamando al procedimiento HttpStatusCode(), que forma parte de la clase HttpResponseMessage.

Podemos clasificar los códigos de estado en cinco grupos.

  • 1xx: códigos informativos; la solicitud se ha recibido y el proceso continúa.

  • 2xx: el servidor ha recibido y aceptado correctamente la solicitud; el código 200 significa OK, mientras que el 201 se usa a menudo cuando se ha creado un registro.

  • 3xx: se utilizan para indicar que el recurso solicitado ha sido trasladado o redirigido a otra ubicación.

  • 4xx: hay un error en el cliente; la solicitud contiene un error. Este código puede ser 400 (solicitud incorrecta, como cuando se usa una estructura o unos datos JSON incorrectos), 401 (acceso denegado, cuando se usan credenciales incorrectas), 404 (acceso prohibido) y 404 (no encontrado, cuando no se puede localizar el recurso debido a un error en la URL).

  • 5xx: hay un error en el servidor. Un código de estado 500 (error interno del servidor) indica que el servidor no ha podido procesar la solicitud debido a una condición inesperada. Un 503 indica que el servicio está inactivo y no está disponible.

La forma más sencilla de controlar estos códigos de estado es usar el procedimiento IsSuccessStatusCode() en HttpResponseMessage. Esto devuelve un valor booleano que indica si la solicitud ha devuelto un error.

Clase HttpContent

La clase HttpContent representa el cuerpo y los encabezados de contenido HTTP, y se usa como cuerpo para enviar información o como cuerpo de la respuesta. Puede usar la propiedad Content en las clases HttpRequestMessage (con una solicitud) o HttpResponseMessage (con una respuesta).

  • Clear(): establece el objeto HttpContent en un valor predeterminado.

  • GetHeaders(HttpHeaders): obtiene los encabezados HTTP del contenido. El resultado se devuelve en el parámetro HttpHeaders.

  • ReadAs(Result): lee el contenido en el texto o flujo proporcionado. El resultado puede ser de tipo Text o InStream.

  • WriteFrom(Value): establece la variable HttpContent en el texto o flujo proporcionado.

Clase HttpRequestMessage

La clase HttpRequestMessage representa un mensaje de solicitud HTTP. Un mensaje de solicitud es la clase que se utiliza para enviar una solicitud.

[Ok := ] HttpClient.Send(HttpRequestMessage, HttpResponseMessage);
  • Content(): obtiene o establece el contenido de la solicitud HTTP.

  • GetRequestUri(): obtiene el URI que se usa para la solicitud HTTP.

  • Method(): obtiene o establece el tipo de método. Debe proporcionar un verbo HTTP que se use con esta solicitud.

  • SetRequestUri(RequestUri): establece el URI que se usa para la solicitud HTTP.

var
    client: HttpClient;
    requestMessage: HttpRequestMessage;
    responseMessage: HttpResponseMessage;
begin 
    requestMessage.Method('GET');
    requestMessage.SetRequestUri('https://jsonplaceholder.typicode.com/posts');
    client.Send(requestMessage, responseMessage);
end;