Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La transferencia de estado representacional (REST) es un estilo arquitectónico para crear servicios web. Normalmente, las solicitudes REST se realizan a través de HTTPS con los mismos verbos HTTP que usan los exploradores web para recuperar páginas web y enviar datos a los servidores. Los verbos son:
- GET : esta operación se usa para recuperar datos del servicio web.
- POST : esta operación se usa para crear un nuevo elemento de datos en el servicio web.
- PUT : esta operación se usa para actualizar un elemento de datos en el servicio web.
- PATCH : esta operación se usa para actualizar un elemento de datos en el servicio web mediante la descripción de un conjunto de instrucciones sobre cómo se debe modificar el elemento.
- DELETE : esta operación se usa para eliminar un elemento de datos en el servicio web.
Las API de servicio web que se adhieren a REST se definen mediante:
- Un URI base.
- Métodos HTTP, como GET, POST, PUT, PATCH o DELETE.
- Tipo de medio para los datos, como notación de objetos JavaScript (JSON).
Normalmente, los servicios web basados en REST usan mensajes JSON para devolver datos al cliente. JSON es un formato de intercambio de datos basado en texto que genera cargas compactas, lo que produce requisitos de ancho de banda reducidos al enviar datos. La simplicidad de REST ha ayudado a convertirlo en el método principal para acceder a servicios web en aplicaciones móviles.
Nota:
El acceso a un servicio web a menudo requiere programación asincrónica. Para obtener más información sobre la programación asincrónica, consulte Programación asincrónica con async y await.
Operaciones de servicio web
El servicio REST de ejemplo se escribe mediante ASP.NET Core y proporciona las siguientes operaciones:
| Operation | Método HTTP | URI relativo | Parámetros |
|---|---|---|---|
| Obtener una lista de ítems de tareas pendientes | GET | /api/todoitems/ | |
| Crear una nueva tarea pendiente | POST | /api/todoitems/ | Un objeto TodoItem con formato JSON |
| Actualizar un ítem de la lista de tareas | PUT | /api/todoitems/ | Un objeto TodoItem con formato JSON |
| Eliminar un elemento de la lista de tareas | DELETE | /api/todoitems/{id} |
La aplicación .NET MAUI y el servicio web usan la TodoItem clase para modelar los datos que se muestran y se envían al servicio web para el almacenamiento:
public class TodoItem
{
public string ID { get; set; }
public string Name { get; set; }
public string Notes { get; set; }
public bool Done { get; set; }
}
La ID propiedad se usa para identificar de forma única cada TodoItem objeto y el servicio web usa para identificar los datos que se van a actualizar o eliminar. Por ejemplo, para eliminar el TodoItem cuyo ID es aaaabbbb-0000-cccc-1111-dddd2222eeee, la aplicación MAUI de .NET envía una solicitud de eliminación a https://hostname/api/todoitems/aaaabbbb-0000-cccc-1111-dddd2222eeee.
Cuando el marco de api web recibe una solicitud, enruta la solicitud a una acción. Estas acciones son métodos públicos en la TodoItemsController clase . El marco de API web utiliza el middleware de enrutamiento para coincidir con las direcciones URL de las solicitudes entrantes y asignarlas a acciones. Las API REST deben usar el enrutamiento de atributos para modelar la funcionalidad de la aplicación como un conjunto de recursos cuyas operaciones se representan mediante verbos HTTP. El enrutamiento mediante atributos utiliza un conjunto de atributos para asignar acciones directamente a las plantillas de ruta. Para obtener más información sobre el enrutamiento de atributos, consulte Enrutamiento de atributos para las API REST. Para obtener más información sobre cómo crear el servicio REST mediante ASP.NET Core, consulte Creación de servicios back-end para aplicaciones móviles nativas.
Creación del objeto HTTPClient
Una aplicación de interfaz de usuario de aplicación multiplataforma de .NET (.NET MAUI) puede consumir un servicio web basado en REST mediante el envío de solicitudes al servicio web con la HttpClient clase . Esta clase proporciona funcionalidad para enviar solicitudes HTTP y recibir respuestas HTTP de un recurso identificado por URI. Cada solicitud se envía como una operación asincrónica.
El HttpClient objeto debe declararse en el nivel de clase para que resida mientras la aplicación necesite realizar solicitudes HTTP:
public class RestService
{
HttpClient _client;
JsonSerializerOptions _serializerOptions;
public List<TodoItem> Items { get; private set; }
public RestService()
{
_client = new HttpClient();
_serializerOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
}
...
}
El JsonSerializerOptions objeto se usa para configurar el formato de la carga JSON que se recibe y se envía al servicio web. Para obtener más información, consulte Cómo instanciar instancias de JsonSerializerOptions con System.Text.Json.
Recuperar datos
El HttpClient.GetAsync método se usa para enviar una solicitud GET al servicio web especificado por el URI y, a continuación, recibir la respuesta del servicio web:
public async Task<List<TodoItem>> RefreshDataAsync()
{
Items = new List<TodoItem>();
Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
try
{
HttpResponseMessage response = await _client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
Items = JsonSerializer.Deserialize<List<TodoItem>>(content, _serializerOptions);
}
}
catch (Exception ex)
{
Debug.WriteLine(@"\tERROR {0}", ex.Message);
}
return Items;
}
Los datos se reciben del servicio web como un HttpResponseMessage objeto . Contiene información sobre la respuesta, incluido el código de estado, los encabezados y cualquier cuerpo. El servicio REST envía un código de estado HTTP en su respuesta, que se puede obtener de la HttpResponseMessage.IsSuccessStatusCode propiedad , para indicar si la solicitud HTTP se realizó correctamente o no. Para esta operación, el servicio REST envía el código de estado HTTP 200 (CORRECTO) en la respuesta, lo que indica que la solicitud se realizó correctamente y que la información solicitada está en la respuesta.
Si la operación HTTP se realizó correctamente, se lee el contenido de la respuesta. La HttpResponseMessage.Content propiedad representa el contenido de la respuesta y es de tipo HttpContent. La HttpContent clase representa el cuerpo HTTP y los encabezados de contenido, como Content-Type y Content-Encoding. A continuación, el contenido se lee en un string mediante el método HttpContent.ReadAsStringAsync.
string A continuación, se deserializa de JSON a un List de objetos TodoItem.
Advertencia
El uso del método ReadAsStringAsync para recuperar una respuesta grande puede tener un impacto negativo en el rendimiento. En tales circunstancias, la respuesta debe deserializarse directamente para evitar tener que almacenarla completamente en búfer.
Creación de datos
El HttpClient.PostAsync método se usa para enviar una solicitud POST al servicio web especificado por el URI y, a continuación, para recibir la respuesta del servicio web:
public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
try
{
string json = JsonSerializer.Serialize<TodoItem>(item, _serializerOptions);
StringContent content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = null;
if (isNewItem)
response = await _client.PostAsync(uri, content);
else
response = await _client.PutAsync(uri, content);
if (response.IsSuccessStatusCode)
Debug.WriteLine(@"\tTodoItem successfully saved.");
}
catch (Exception ex)
{
Debug.WriteLine(@"\tERROR {0}", ex.Message);
}
}
En este ejemplo, la TodoItem instancia se serializa en una carga JSON para enviar al servicio web. A continuación, esta carga se inserta en el cuerpo del contenido HTTP que se enviará al servicio web antes de realizar la solicitud con el PostAsync método .
El servicio REST envía un código de estado HTTP en su respuesta, que se puede obtener de la HttpResponseMessage.IsSuccessStatusCode propiedad , para indicar si la solicitud HTTP se realizó correctamente o no. Las respuestas típicas para esta operación son:
- 201 (CREATED): la solicitud dio lugar a que se creara un nuevo recurso antes de enviar la respuesta.
- 400 (SOLICITUD INCORRECTA): el servidor no entiende la solicitud.
- 409 (CONFLICT): no se pudo realizar la solicitud debido a un conflicto en el servidor.
Actualización de datos
El HttpClient.PutAsync método se usa para enviar una solicitud PUT al servicio web especificado por el URI y, a continuación, recibir la respuesta del servicio web:
public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
...
response = await _client.PutAsync(uri, content);
...
}
La operación del PutAsync método es idéntica al PostAsync método que se usa para crear datos en el servicio web. Sin embargo, las posibles respuestas enviadas desde el servicio web difieren.
El servicio REST envía un código de estado HTTP en su respuesta, que se puede obtener de la HttpResponseMessage.IsSuccessStatusCode propiedad , para indicar si la solicitud HTTP se realizó correctamente o no. Las respuestas típicas para esta operación son:
- 204 (SIN CONTENIDO): la solicitud se ha procesado correctamente y la respuesta está en blanco intencionadamente.
- 400 (SOLICITUD INCORRECTA): el servidor no entiende la solicitud.
- 404 (NO ENCONTRADO): el recurso solicitado no existe en el servidor.
Eliminación de datos
El HttpClient.DeleteAsync método se usa para enviar una solicitud DELETE al servicio web especificado por el URI y, a continuación, recibir la respuesta del servicio web:
public async Task DeleteTodoItemAsync(string id)
{
Uri uri = new Uri(string.Format(Constants.RestUrl, id));
try
{
HttpResponseMessage response = await _client.DeleteAsync(uri);
if (response.IsSuccessStatusCode)
Debug.WriteLine(@"\tTodoItem successfully deleted.");
}
catch (Exception ex)
{
Debug.WriteLine(@"\tERROR {0}", ex.Message);
}
}
El servicio REST envía un código de estado HTTP en su respuesta, que se puede obtener de la HttpResponseMessage.IsSuccessStatusCode propiedad , para indicar si la solicitud HTTP se realizó correctamente o no. Las respuestas típicas para esta operación son:
- 204 (SIN CONTENIDO): la solicitud se ha procesado correctamente y la respuesta está en blanco intencionadamente.
- 400 (SOLICITUD INCORRECTA): el servidor no entiende la solicitud.
- 404 (NO ENCONTRADO): el recurso solicitado no existe en el servidor.
Desarrollo local
Si va a desarrollar un servicio web REST localmente con un marco como ASP.NET Core Web API, puede depurar el servicio web y la aplicación MAUI de .NET al mismo tiempo. En este escenario, para consumir el servicio web a través de HTTP desde emuladores de Android y simuladores de iOS, debe habilitar el tráfico HTTP de texto no cifrado en la aplicación MAUI de .NET. Para obtener más información, consulte Conexión a servicios web locales desde emuladores de Android y simuladores de iOS.
Examinar el ejemplo