Использование веб-службы на основе REST
Интеграция веб-службы в приложение является общим сценарием. В этой статье показано, как использовать веб-службу 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, как показано на следующем снимке экрана:
Примечание.
В 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-24ebce87e243
DELETE. Дополнительные сведения о модели данных, используемой в примере приложения, см. в разделе "Моделирование данных".
Когда платформа веб-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 в List
TodoItem
экземпляры.
Предупреждение
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. Сведения о настройке проекта для предоставления связи см. в Подключение локальных веб-службах.