Теперь создадим проект Xamarin Forms, который будет взаимодействовать с сервисом ASP NET Core из прошлой темы. Первым делом добавим в проект через Nuget пакет System.Text.Json для работы с json.
После добавления выше перечисленных пакетов определим в главном проекте класс, который будет представлять основную модель приложения - класс Friend:
namespace MobileClient { public class Friend { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public string Phone { get; set; } public override bool Equals(object obj) { Friend friend = obj as Friend; return this.Id==friend.Id; } } }
И также добавим в проект вспомогательный класс, через который мы будем взаимодействовать с сервером - класс FriendService:
using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; using System.Threading.Tasks; namespace HelloApp { public class FriendsService { const string Url = "http://192.168.1.18:3000/api/friends/"; // обращайте внимание на конечный слеш // настройки для десериализации для нечувствительности к регистру символов JsonSerializerOptions options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, }; // настройка клиента private HttpClient GetClient() { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Accept", "application/json"); return client; } // получаем всех друзей public async Task<IEnumerable<Friend>> Get() { HttpClient client = GetClient(); string result = await client.GetStringAsync(Url); return JsonSerializer.Deserialize<IEnumerable<Friend>>(result, options); } // добавляем одного друга public async Task<Friend> Add(Friend friend) { HttpClient client = GetClient(); var response = await client.PostAsync(Url, new StringContent( JsonSerializer.Serialize(friend), Encoding.UTF8, "application/json")); if (response.StatusCode != HttpStatusCode.OK) return null; return JsonSerializer.Deserialize<Friend>( await response.Content.ReadAsStringAsync(), options); } // обновляем друга public async Task<Friend> Update(Friend friend) { HttpClient client = GetClient(); var response = await client.PutAsync(Url, new StringContent( JsonSerializer.Serialize(friend), Encoding.UTF8, "application/json")); if (response.StatusCode != HttpStatusCode.OK) return null; return JsonSerializer.Deserialize<Friend>( await response.Content.ReadAsStringAsync(), options); } // удаляем друга public async Task<Friend> Delete(int id) { HttpClient client = GetClient(); var response = await client.DeleteAsync(Url + id); if (response.StatusCode != HttpStatusCode.OK) return null; return JsonSerializer.Deserialize<Friend>( await response.Content.ReadAsStringAsync(), options); } } }
Для обращения к веб-сервису здесь применяется класс HttpClient и его методы. В данном случае предполагается, что веб-сервис запущен по адресу http://192.168.1.18:3000, в вашем случае адрес может быть иным.
При локальном тестировании, когда веб-приложение и мобильное приложение запускаются одновременно на локальной машине, советую запускать веб-приложение по протоколу http, а не https, чтобы у HttpClient не возникло проблем с сертификатами.
Первый метод GetClient()
используется для создания и конфигурации объекта HttpClient. Здесь мы можем сразу установить различные заголовки. В данном
случае мы устанавливаем заголовок Accept, чтобы сервер отдавал нам данные в формате json.
Метод Get загружает все данные и преобразует их в объекты Friend посредством метода JsonSerializer.Deserialize()
:
public async Task<IEnumerable<Friend>> Get() { HttpClient client = GetClient(); string result = await client.GetStringAsync(Url); return JsonSerializer.Deserialize<IEnumerable<Friend>>(result, options);); }
Метод Add посылает серверу новые данные:
public async Task<Friend> Add(Friend friend) { HttpClient client = GetClient(); var response = await client.PostAsync(Url, new StringContent( JsonSerializer.Serialize(friend), Encoding.UTF8, "application/json")); if (response.StatusCode != HttpStatusCode.OK) return null; return JsonSerializer.Deserialize<Friend>( await response.Content.ReadAsStringAsync(), options);); }
Для отправки объект сериализуется с помощью метода JsonSerializer.Serialize()
в формат json.
Так как созданный в прошлой теме сервер после добавления возвращает добавленный объект, то соответственно здесь мы его можем получить и возвратить в качестве результата метода. При этом мы ожидаем, что ответ от сервера будет иметь статусный код 200. Если же статусный код другой, например, 40х, то возвращаем null.
Методы Update и Delete, предназначенные для обновления и удаления данных, в целом аналогичны методу Add.