Search code examples
c#xamarinxamarin.formshttpclientdotnet-httpclient

HttpClient How to catch every response in one place


I'm working on Xamarin.Forms App connected with Web Api 2 Api and all requests and responses work with HttClient. This is my code:

class for all my requests and definiot of HttpClient

  public class DataStore : IDataStore<object>
    {
        HttpClient client;

        public DataStore()
        {
            client = new HttpClient()
            {
                BaseAddress = new Uri($"{App.Uri}")
            };

        }

Example of one of my requests :

   public async Task<User> GetProfileSetup()
        {
            try
            {
                if (CrossConnectivity.Current.IsConnected)
                {
                    string token = DependencyService.Get<ISharedFunctions>().GetAccessToken();

                    client.DefaultRequestHeaders.Clear();
                    client.DefaultRequestHeaders.Add("Accept", "application/json");
                    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);

                    var response = await client.GetAsync(@"api/User/GetProfilSetup");
                    if (response.IsSuccessStatusCode)
                    {
                        string jsonMessage;
                        using (Stream responseStream = await response.Content.ReadAsStreamAsync())
                        {
                            jsonMessage = new StreamReader(responseStream).ReadToEnd();
                        }
                        User user = JsonConvert.DeserializeObject<User>(jsonMessage);


                        return user;
                    }
                    else
                    {
                        var m = response.Content.ToString();
                        return null;
                    }

                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                string error = ex.Message;
                return null;

            }
        }

My idea is to check every response(Response Status Code) in one place. I need this for throw Alert Errors , for refresh token etc. Is there a possible way to this ? I want to have control on every request/response.


Solution

  • if anyone have problem with this , just need to implement custom handler , who will inherit form DelegatingHandler. My code example:

      public class StatusCodeHandler : DelegatingHandler
        {
            public StatusCodeHandler(HttpMessageHandler innerHandler) : base(innerHandler) { }
            public GetStatusCode GetStatusCode = new GetStatusCode();
            protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                HttpResponseMessage response = null;
                    response = await base.SendAsync(request, cancellationToken);
                    if (response.IsSuccessStatusCode)
                    {
                        return response;
                    }
                else
                { 
                    var status_code = (int)response.StatusCode;
                    GetStatusCode.GetResponseCode(status_code);
                }
                return response;
            }
    
         }