Взаимодействие с веб-сервисом

Последнее обновление: 14.01.2021

Теперь создадим проект 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.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850