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

Download Sample Скачайте пример

Интеграция веб-службы в приложение является общим сценарием. В этой статье показано, как использовать веб-службу RESTful из Xamarin.Forms приложения.

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

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

API-интерфейсы веб-службы, которые соответствуют REST, называются RESTful API и определяются с помощью следующих элементов:

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

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

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

При запуске примера приложения он подключается к локально размещенной службе REST, как показано на следующем снимке экрана:

Sample Application

Примечание.

В iOS 9 и более поздней версии безопасность транспорта приложений (ATS) обеспечивает безопасные подключения между интернет-ресурсами (например, сервером приложения) и приложением, тем самым предотвращая случайное раскрытие конфиденциальной информации. Так как ATS включен по умолчанию в приложениях, созданных для iOS 9, все подключения будут соответствовать требованиям безопасности ATS. Если подключения не соответствуют этим требованиям, они завершаются сбоем с исключением.

ATS можно отказаться от использования протокола HTTPS и безопасного взаимодействия для интернет-ресурсов. Это можно сделать, обновив файл Info.plist приложения. Дополнительные сведения см. в разделе "Безопасность транспорта приложений".

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

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

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

Большинство URI включают TodoItem идентификатор в путь. Например, чтобы удалить TodoItem идентификатор 6bb8a868-dba1-4f1a-93b7-24ebce87e243, клиент отправляет запрос http://hostname/api/todoitems/6bb8a868-dba1-4f1a-93b7-24ebce87e243DELETE. Дополнительные сведения о модели данных, используемой в примере приложения, см. в разделе "Моделирование данных".

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

Класс HttpClient используется для отправки и получения запросов по протоколу HTTP. Он предоставляет функциональные возможности для отправки HTTP-запросов и получения HTTP-ответов из определяемого ресурса URI. Каждый запрос отправляется как асинхронная операция. Дополнительные сведения об асинхронных операциях см. в обзоре поддержки Async.

Класс HttpResponseMessage представляет сообщение HTTP-ответа, полученное от веб-службы после выполнения HTTP-запроса. Он содержит сведения об ответе, включая код состояния, заголовков и любой текст. HttpContent Класс представляет тело HTTP и заголовки содержимого, таких как Content-Type и Content-Encoding. Содержимое можно считывать с помощью любого из ReadAs методов, таких как ReadAsStringAsync и ReadAsByteArrayAsyncв зависимости от формата данных.

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

HttpClient Экземпляр объявляется на уровне класса, чтобы объект работал до тех пор, пока приложение должно выполнять HTTP-запросы, как показано в следующем примере кода:

public class RestService : IRestService
{
  HttpClient client;
  ...

  public RestService ()
  {
    client = new HttpClient ();
    ...
  }
  ...
}

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

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

public async Task<List<TodoItem>> RefreshDataAsync ()
{
  ...
  Uri uri = new Uri (string.Format (Constants.TodoItemsUrl, string.Empty));
  ...
  HttpResponseMessage response = await client.GetAsync (uri);
  if (response.IsSuccessStatusCode)
  {
      string content = await response.Content.ReadAsStringAsync ();
      Items = JsonSerializer.Deserialize<List<TodoItem>>(content, serializerOptions);
  }
  ...
}

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

Если операция HTTP прошла успешно, содержимое ответа считывается для отображения. Свойство HttpResponseMessage.Content представляет содержимое HTTP-ответа, а HttpContent.ReadAsStringAsync метод асинхронно записывает содержимое HTTP в строку. Затем это содержимое десериализируется из JSON в ListTodoItem экземпляры.

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

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

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

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

public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
  Uri uri = new Uri (string.Format (Constants.TodoItemsUrl, string.Empty));

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

  if (response.IsSuccessStatusCode)
  {
    Debug.WriteLine (@"\tTodoItem successfully saved.");
  }
  ...
}

Экземпляр 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.TodoItemsUrl, id));
  ...
  HttpResponseMessage response = await client.DeleteAsync (uri);
  if (response.IsSuccessStatusCode)
  {
    Debug.WriteLine (@"\tTodoItem successfully deleted.");
  }
  ...
}

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

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

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

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