public void Execute <T>(ServiceRequest serviceRequest, Action <ServiceRequest.Response <T> > completedhandler) where T : new()
        {
            if (serviceRequest == null)
            {
                SDKLogger.Instance.Error("serviceRequest is null.");
                completedhandler?.Invoke(new ServiceRequest.Response <T>()
                {
                    StatusCode = 0
                });
                return;
            }

            RestRequest request = new RestRequest(serviceRequest.Resource, (Method)serviceRequest.Method);

            if (serviceRequest.AccessToken != null)
            {
                request.AddHeader("Authorization", "Bearer " + serviceRequest.AccessToken);
            }

            foreach (var pair in serviceRequest.Headers)
            {
                request.AddHeader(pair.Key, pair.Value);
            }

            foreach (var pair in serviceRequest.QueryParameters)
            {
                request.AddParameter(pair.Key, pair.Value, ParameterType.GetOrPost);
            }

            foreach (var pair in serviceRequest.BodyParameters)
            {
                request.AddParameter(pair.Key, pair.Value, ParameterType.GetOrPost);
            }

            if (serviceRequest.RootElement.Length != 0)
            {
                request.RootElement = serviceRequest.RootElement;
            }
            //Cisco Spark platform is dropping support for TLS 1.0 as of March 16, 2018
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;

            var client = new RestClient()
            {
                BaseUrl = new System.Uri(serviceRequest.BaseUri)
            };


            SDKLogger.Instance.Info($"http request[{serviceRequest.Method.ToString()}]: {serviceRequest.BaseUri + request.Resource}");
            client.ExecuteAsync <T>(request, response =>
            {
                var r               = new ServiceRequest.Response <T>();
                r.StatusCode        = (int)response.StatusCode;
                r.StatusDescription = response.StatusDescription;
                r.Headers           = new List <KeyValuePair <string, object> >();
                foreach (var i in response.Headers)
                {
                    r.Headers.Add(new KeyValuePair <string, object>(i.Name, i.Value));
                }

                r.Data = response.Data;

                completedhandler?.Invoke(r);
            });
        }