Распространенный вопрос, что особенно любят задавать новички в работе с Xamarin, которые имеют опыт разработки в веб-сфере, следующий — как можно подключиться к удаленной базе данных из мобильного приложения? Работа с клиентским приложением отличается от работы с приложением, функционирующим на сервере, поскольку у разработчика в этом случае нет прямого доступа к ресурсам, реализуемым на сервере, например, таким, как базы данных. В этом случае требуется способ для приема запросов от клиента и передачи их базе данных.
API на основе REST
Наиболее распространенным способом для достижения этой цели является API-интерфейс, основанный на REST. Этот API-интерфейс похож на веб-страницу, но пользователь её не просматривает и не видит на ней код HTML, вместо этого мобильное приложение или другой клиент, подключается к этому интерфейсу, отправляет ему команды и получает данные из него; чаще всего эти данные приходят в формате JSON.
API-интерфейс REST позволяет выполнять вызовы HTTP и возвращать требуемые данные. Например, можно отправить следующие:
1 | GET https://api.domain.com/v1/products/1 |
А вернется нечто подобное:
1 2 3 4 | { "id": "91D87ACA-3C91-4AC2-A806-C82B074DD7C9", "name": "Xamarin Monkey" } |
Если требуется добавить данные, используется запрос POST и данные отправляются в форме запроса.
1 2 3 4 5 | POST https://api.domain.com/v1/products { "name": "Xamarin Shirt" } |
Если вы хотите разобраться в том, как создать API и базу данных в Azure, ознакомьтесь со следующими материалами:
- Создание базы данных SQL Azure
- Создание интерфейса API в Azure
- Даже если развертывание на Azure не планируется, из данного примера можно узнать, как создается API-интерфейс.
Если требуются дополнительные сведения о API-интерфейсах REST и о том, как они работают, ознакомьтесь с материалом Передача состояний представления или воспользуйтесь Google для поиска дополнительных статей или видеозаписей по этой теме.
HttpClient
Предположим, что Вы следовали приведенным выше статьям или уже имеете API-интерфейс, теперь рассмотрим, как мы подключаемся к этой базе данных из Xamarin.
К сведению: HttpClient предназначен для повторного использования, поэтому создается один экземпляр HttpClient и многократно используется в приложении.
Если мы хотим сделать запрос GET, мы должны использовать вот что:
1 2 3 4 | var uri = "https://api.domain.com/v1/products/1"; HttpClient client = new HttpClient(); var response = await client.GetAsync(uri); |
Если мы хотим сделать запрос POST, мы должны использовать вот это:
1 2 3 4 | var uri = "https://api.domain.com/v1/products"; var content = new StringContent("{\"name:\":\"Xamarin Shirt\"}"); HttpClient client = new HttpClient(); var response = await client.PostAsync(uri, content); |
И если мы хотим добавить некий заголовок, например, заголовок проверки подлинности, мы можем сделать следующее:
1 2 3 | client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "my_access_token"); client.Headers.Add("key", "value"); // For any other types of headers. |
Используя JSON.NET, мы также можем легко преобразовать ответ JSON в объект. Можно сказать, что API возвращает в формате JSON следующие:
1 2 3 4 | { "id": "91D87ACA-3C91-4AC2-A806-C82B074DD7C9", "name": "Xamarin Monkey" } |
Затем мы создадим эту модель в нашем проекте Xamarin:
1 2 3 4 5 | public class Product { public Guid Id { get; set; } public string Name { get; set; } } |
Теперь, когда мы получаем ответ от API, мы используем JSON.NET для преобразования его в объект.
1 | var product = JsonConvert.Deserialize<Product>(response.Content); |
Как Вы могли видеть, когда я сделал запрос POST выше, я ввел строку. Если необходимо преобразовать модель/объект в строку JSON, мы также можем использовать для этого JSON.NET.
1 2 | var product = new Product() { Name = "Xamarin Shirt" }; var json = JsonConvert.Serialize(product); |
Почему бы не подключиться напрямую к базе данных?
Вы, быть может, недоумеваете, почему Вы не можете просто подключиться непосредственно к базе данных из мобильного приложения? Основные причины:
Безопасность
Не в Ваших интересах, чтобы мобильные клиентские приложения имели строку подключения к базе данных с именем пользователя и паролем. Таким образом Ваша база данных будет открыта для всех. Можно создать пользователя с разрешениями только для чтения и открыть доступ только к определенным таблицам, однако, в этом случае пользователи все еще смогут видеть все данные в этих таблицах. В API-интерфейсе можно реализовать дополнительные проверки безопасности и проверить подлинность на основе OAuth или существующей системы управления пользователями.
Производительность
Подключения к базам данных не предназначены для работы с большими задержками. Вероятно, подключение к базе данных будет часто отваливаться, что каждый раз будет приводить к повторным подключениям.
Контроль
С помощью API-интерфейса можно управлять потоком данных, идущих в базу данных и исходящих из нее. Можно реализовать ограничение скорости и осуществлять наблюдение за всеми запросами. Если потребуется изменить бизнес-логику или даже то, какие базы данных или ресурсы используются с помощью каждого запроса API, это можно будет сделать на сервере без необходимости повторного развертывания мобильного приложения.
Ресурсы
Благодаря API уменьшается потребность в серверных ресурсах. Хотя может возникнуть необходимость установки другого сервера для обработки какого-нибудь API, интерфейс API REST создан эффективным и не фиксирующим состояние. Благодаря API в будущем для многих пользователей упрощается масштабирование.
Автор: Adam Pedley
Источник: XamarinHelp.com
Здравствуйте! Я в прошлом году мучался с REST-APi и Xamarin. Суть была вот в чем. Я поднял сайт на WordPress и собрал в нем каталог кружков и секций для детей. Потом скачал плагин REST, который давал ссылку на полный список кружков в формате json. Ссылка была очень странной и другого форматаб чем у вас в статьеб всвязи с этим у меня назрел такой впрос — А можно ли указать простую ссылку на определенный каталог? Или ссылка долна быть специальной? Что если бы меня не было плагина REST для WordPressб как бы мне пришлось получить ссылку на данные в формате json? Подскажите пожалуйстаб а то не могу понять.