Добавить обработку ошибок в общий класс HTTPClient - PullRequest
0 голосов
/ 13 марта 2019

У меня есть общий класс для использования в сети операции CRUD.

 public class RequestService:IRequest
{
    public HttpClient GetClient()
    {
         string USERNAME = "XXXXXX";
         string PASSWORD = "XXXXX";
         string BASE_ADDRESS = "https://something.net/api/sync/";

        var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{USERNAME}:{PASSWORD}")));
        var client = new HttpClient
        {
            BaseAddress = new Uri(BASE_ADDRESS),
            DefaultRequestHeaders = { Authorization = authValue }
        };
        return client;
    }

    public async Task<TResult> GetAsync<TResult>(HttpClient client, string url)
    {
        client.Timeout = TimeSpan.FromSeconds(30);
        var response = await client.GetAsync(url);
        response.EnsureSuccessStatusCode();
        var jsonString = await response.Content.ReadAsStringAsync();
        var result = JsonConvert.DeserializeObject<TResult>(jsonString);
        return result;
    }

    public async Task<string> GetStringAsync(HttpClient client, string url)
    {
        var httpRequest = new HttpRequestMessage(new HttpMethod("GET"), url);
        var response = client.SendAsync(httpRequest).Result;
        var jsonString = await response.Content.ReadAsStringAsync();
        return jsonString;
    }

    public async Task<TResult> PostAsync<TRequest, TResult>(HttpClient client, TRequest t,string url)
    {
        var json = JsonConvert.SerializeObject(t);
        HttpContent httpContent = new StringContent(json);
        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        var response = await client.PostAsync(url, httpContent);
        response.EnsureSuccessStatusCode();
        var jsonString = await response.Content.ReadAsStringAsync();
        var result = JsonConvert.DeserializeObject<TResult>(jsonString);
        return result;

    }
}

И у меня есть собственный класс, из которого вызываются сетевые службы.

 public class DeviceService:IDevice
{
    private IRequest RequestService;

    public DeviceService(IRequest request)
    {
        RequestService = request;
    }

    public async Task<int> GetDeviceID()
    {
        var client = RequestService.GetClient();
        var id = await RequestService.PostAsync<Object, int>(client, null, "Registerdevice");
        return id;
    }
}

А во ViewModel:

DeviceService.GetDeviceID();

Так что все работает нормально, когда у меня стабильный интернет или успешный ответ с сервера. Теперь я хочу добавить в код возможность обработки ошибок, в том числе: отсутствие подключения к Интернету, другие сетевые исключения и обработку ошибок API, чтобы я мог информировать пользователей об ошибках. Я не уверен, как это сделать. Я попытался использовать блок try-catch внутри класса RequestService, прочитал каждое исключение и выдал его, тогда это означало бы, что мне нужно добавить блок try-catch в классе DeviceService и ViewModel. Или нужно? Я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...