Использование веб-службы на основе REST

Browse sample. Обзор примера

Передача репрезентативного состояния (REST) — это архитектурный стиль для создания веб-служб. Запросы REST обычно выполняются по протоколу HTTPS, используя те же HTTP-команды, которые веб-браузеры используют для получения веб-страниц и отправки данных на серверы. Ниже приведен перечень команд.

  • GET — эта операция используется для получения данных из веб-службы.
  • POST — эта операция используется для создания нового элемента данных в веб-службе.
  • PUT — эта операция используется для обновления элемента данных в веб-службе.
  • PATCH — эта операция используется для обновления элемента данных веб-службы путем описания набора инструкций по изменению элемента.
  • DELETE — эта операция используется для удаления элемента данных в веб-службе.

API веб-службы, которые соответствуют REST, определяются с помощью:

  • Базовый универсальный код ресурса (URI).
  • Методы HTTP, такие как GET, POST, WHERE, PATCH или DELETE.
  • Тип носителя для данных, например нотация объектов JavaScript (JSON).

Веб-службы на основе REST обычно используют сообщения JSON для возврата данных клиенту. JSON — это текстовый формат обмена данными, который создает компактные полезные данные, что приводит к снижению требований к пропускной способности при отправке данных. Простота REST помогла сделать его основным методом для доступа к веб-службам в мобильных приложениях.

Примечание.

Для доступа к веб-службе часто требуется асинхронное программирование. Дополнительные сведения об асинхронном программировании см. в статье асинхронное программирование с асинхронным программированием и ожиданием.

Операции веб-службы

Пример службы REST записывается с помощью ASP.NET Core и предоставляет следующие операции:

Операция Метод HTTP Относительный универсальный код ресурса (URI) Параметры
Получение списка элементов todo GET /api/todoitems/
Создание нового элемента todo POST /api/todoitems/ Формат JSON TodoItem
Обновление элемента todo PUT /api/todoitems/ Формат JSON TodoItem
Удаление элемента todo DELETE /api/todoitems/{id}

Приложение .NET MAUI и веб-служба используют TodoItem класс для моделирования данных, отображаемых и отправленных в веб-службу для хранения:

public class TodoItem
{
    public string ID { get; set; }
    public string Name { get; set; }
    public string Notes { get; set; }
    public bool Done { get; set; }
}

Свойство ID используется для уникальной идентификации каждого TodoItem объекта и используется веб-службой для идентификации данных для обновления или удаления. Например, чтобы удалить TodoItem идентификатор 6bb8a868-dba1-4f1a-93b7-24ebce87e243, приложение .NET MAUI отправляет запрос https://hostname/api/todoitems/6bb8a868-dba1-4f1a-93b7-24ebce87e243DELETE.

Когда платформа веб-API получает запрос, он направляет запрос в действие. Эти действия являются общедоступными методами TodoItemsController в классе. Платформа веб-API использует ПО промежуточного слоя маршрутизации, чтобы сопоставить URL-адреса входящих запросов и сопоставить их с действиями. REST API должны использовать маршрутизацию атрибутов для моделирования функциональных возможностей приложения в виде набора ресурсов, операции которых представлены HTTP-командами. При маршрутизации с помощью атрибутов используется набор атрибутов для сопоставления действий непосредственно с шаблонами маршрутов. Дополнительные сведения о маршрутизации атрибутов см. в разделе "Маршрутизация атрибутов" для REST API. Дополнительные сведения о создании службы REST с помощью ASP.NET Core см. в статье "Создание серверных служб для собственных мобильных приложений".

Создание объекта HTTPClient

Приложение .NET Multi-platform App UI (.NET MAUI) может использовать веб-службу на основе REST, отправляя запросы в веб-службу с HttpClient помощью класса. Этот класс предоставляет функциональные возможности для отправки HTTP-запросов и получения HTTP-ответов из определяемого ресурса URI. Каждый запрос отправляется как асинхронная операция.

Объект HttpClient должен быть объявлен на уровне класса, чтобы он работал до тех пор, пока приложение должно выполнять 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
        };
    }
    ...
}

Объект JsonSerializerOptions используется для настройки форматирования полезных данных JSON, полученных и отправленных в веб-службу. Дополнительные сведения см. в статье Создание экземпляров экземпляров JsonSerializerOptions с помощью System.Text.Json.

Извлечение данных

Метод HttpClient.GetAsync используется для отправки запроса GET в веб-службу, указанную URI, а затем получает ответ от веб-службы:

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;
}

Данные получаются из веб-службы в качестве HttpResponseMessage объекта. Он содержит сведения об ответе, включая код состояния, заголовков и любой текст. Служба REST отправляет код состояния HTTP в ответе, который можно получить из HttpResponseMessage.IsSuccessStatusCode свойства, чтобы указать, выполнен ли HTTP-запрос успешно или завершился сбоем. Для этой операции служба REST отправляет код состояния HTTP 200 (ОК) в ответе, который указывает, что запрос выполнен успешно и что запрошенная информация находится в ответе.

Если операция HTTP прошла успешно, содержимое ответа считывается. Свойство HttpResponseMessage.Content представляет содержимое ответа и имеет тип HttpContent. HttpContent Класс представляет тело HTTP и заголовки содержимого, таких как Content-Type и Content-Encoding. Затем содержимое считывается в string метод с помощью HttpContent.ReadAsStringAsync метода. Затем десериализируется string из JSON в ListTodoItem объекты.

Предупреждение

ReadAsStringAsync Использование метода для получения большого ответа может оказать негативное влияние на производительность. В таких случаях ответ должен быть непосредственно десериализирован, чтобы избежать необходимости полностью буферизировать его.

Создание данных

Метод HttpClient.PostAsync используется для отправки запроса POST в веб-службу, указанную URI, а затем для получения ответа от веб-службы:

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);
    }
}

В этом примере TodoItem экземпляр сериализуется в полезные данные JSON для отправки в веб-службу. Затем эта полезные данные внедряется в текст http-содержимого, которое будет отправлено веб-службе перед выполнением запроса с PostAsync помощью метода.

Служба REST отправляет код состояния HTTP в ответе, который можно получить из HttpResponseMessage.IsSuccessStatusCode свойства, чтобы указать, выполнен ли HTTP-запрос успешно или завершился сбоем. Типичные ответы для этой операции:

  • 201 (CREATED) — запрос привел к созданию нового ресурса до отправки ответа.
  • 400 (BAD REQUEST) — запрос не понимается сервером.
  • 409 (CONFLICT) — запрос не удалось выполнить из-за конфликта на сервере.

Обновление данных

Метод HttpClient.PutAsync используется для отправки запроса PUT в веб-службу, указанную URI, а затем получает ответ от веб-службы:

public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
  ...
  response = await _client.PutAsync(uri, content);
  ...
}

Операция PutAsync метода идентична PostAsync методу, который используется для создания данных в веб-службе. Однако возможные ответы, отправленные из веб-службы, отличаются.

Служба REST отправляет код состояния HTTP в ответе, который можно получить из HttpResponseMessage.IsSuccessStatusCode свойства, чтобы указать, выполнен ли HTTP-запрос успешно или завершился сбоем. Типичные ответы для этой операции:

  • 204 (NO CONTENT) — запрос успешно обработан и ответ намеренно пуст.
  • 400 (BAD REQUEST) — запрос не понимается сервером.
  • 404 (NOT FOUND) — запрошенный ресурс не существует на сервере.

Удаление данных

Метод HttpClient.DeleteAsync используется для отправки запроса DELETE в веб-службу, указанную URI, а затем получает ответ от веб-службы:

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);
    }
}

Служба REST отправляет код состояния HTTP в ответе, который можно получить из HttpResponseMessage.IsSuccessStatusCode свойства, чтобы указать, выполнен ли HTTP-запрос успешно или завершился сбоем. Типичные ответы для этой операции:

  • 204 (NO CONTENT) — запрос успешно обработан и ответ намеренно пуст.
  • 400 (BAD REQUEST) — запрос не понимается сервером.
  • 404 (NOT FOUND) — запрошенный ресурс не существует на сервере.

Сервер локальной

Если вы разрабатываете веб-службу REST локально с помощью платформы, например ASP.NET Веб-API Core, вы можете выполнять отладку веб-службы и приложения .NET MAUI одновременно. В этом сценарии для использования веб-службы по протоколу HTTP из эмуляторов Android и симуляторов iOS необходимо включить чистый http-трафик в приложении .NET MAUI. Дополнительные сведения см. в разделе Подключение локальных веб-служб из эмуляторов Android и симуляторов iOS.