Пример #1
0
        /// <summary>
        /// Gets a <see cref="FitbitResponse"/> for a given <see cref="IFitbitRequest"/>.
        /// </summary>
        /// <param name="request">A <see cref="IFitbitRequest"/>.</param>
        /// <exception cref="InvalidOperationException">Thrown when the <see cref="IFitbitRequest"/>
        /// does not contain the required properties.</exception>
        public FitbitResponse GetResponse(IFitbitRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            return(this.MakeRequest(request));
        }
Пример #2
0
        /// <summary>
        /// Makes a request to the Fitbit API.
        /// </summary>
        /// <param name="request">An <see cref="IFitbitRequest"/>.</param>
        /// <returns>An <see cref="FitbitResponse"/>.</returns>
        /// <exception cref="InvalidOperationException">Thrown when the <see cref="IFitbitRequest"/>
        /// does not contain the required properties.</exception>
        private FitbitResponse MakeRequest(IFitbitRequest request)
        {
            var accessToken = string.Empty;

            if (this.user != null)
            {
                accessToken = this.user.TryGetClaimValue(FitbitClient.AccessTokenClaimType);
            }

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(this.apiBaseAddress);

                client.DefaultRequestHeaders.Authorization =
                    new AuthenticationHeaderValue("Bearer", accessToken);

                foreach (var header in request.GetHeaders())
                {
                    client.DefaultRequestHeaders.TryAddWithoutValidation(header.Name, header.Value);
                }

                HttpResponseMessage result;

                if (request.Action == FitbitRequestAction.Get)
                {
                    result = client.GetAsync(request.GetUri()).Result;
                }
                else if (request.Action == FitbitRequestAction.Post)
                {
                    result = client.PostAsync(request.GetUri(), null).Result;
                }
                else if (request.Action == FitbitRequestAction.Delete)
                {
                    result = client.DeleteAsync(request.GetUri()).Result;
                }
                else
                {
                    throw new ArgumentOutOfRangeException("request.Action");
                }

                var response =
                    new FitbitResponse(result.StatusCode, result.Content.ReadAsStringAsync().Result);

                // The access token probably needs refreshing. If this is
                // the first attempt then try the refresh token.
                if (result.StatusCode == HttpStatusCode.Unauthorized)
                {
                    if (!request.SupressTokenRefresh)
                    {
                        // Only try to get a refresh token once...
                        request.SupressTokenRefresh = true;

                        if (this.TryRefreshAccessToken(out response))
                        {
                            return(this.MakeRequest(request));
                        }
                    }
                }

                return(response);
            }
        }