示例#1
0
        /// <summary>
        /// Constructs a <see cref="Uri"/> for a search request based on the provided <paramref name="searchString"/>
        /// <param name="searchString">Search query</param>
        /// <param name="request">Autocomplete request specifying additional components in the search Url to be generated</param>
        /// <returns>URI</returns>
        /// </summary>
        public Uri BuildSearchUrl(string searchString, AutocompleteRequest request)
        {
            var url = new StringBuilder();

            url.Append($"{_baseURL}{_apiKey}");
            url.Append($"&input={searchString}");

            if (!string.IsNullOrWhiteSpace(_language))
            {
                url.Append($"&language={_language}");
            }

            if (request != null)
            {
                if (!string.IsNullOrWhiteSpace(request.Components))
                {
                    url.Append($"&components={request.Components}");
                }

                if (!string.IsNullOrWhiteSpace(request.Types))
                {
                    url.Append($"&types={request.Types}");
                }

                if (!string.IsNullOrWhiteSpace(request.Region))
                {
                    url.Append("&region=au");
                }
            }

            return(new Uri(url.ToString()));
        }
        /// <summary>
        /// Invokes <see cref="SearchAsync(string, AutocompleteRequest)"/> with the given <paramref name="autocomleteRequest"/> and caches the results
        /// <param name="input">Search string</param>
        /// <param name="request">Autocomplete request specifying additional components in the search Url to be generated</param>
        /// </summary>
        public async Task <OperationResult <PlaceResponse> > AutocompleteAsync(string input, AutocompleteRequest autocomleteRequest = null)
        {
            //Get cached results
            var result = _cachingProvider.GetAutocompleteResult(input);

            if (result != null)
            {
                return(OperationResult <PlaceResponse> .AsSuccess(result));
            }

            OperationResult <PlaceResponse> searchResult;

            if (autocomleteRequest != null)
            {
                searchResult = await SearchAsync(input, autocomleteRequest);
            }
            else
            {
                searchResult = await SearchAsync(input, new AutocompleteRequest()
                {
                    Region = "au"
                });
            }


            if (!searchResult.IsSuccessful)
            {
                return(OperationResult <PlaceResponse> .AsFailure("Search response result is null"));
            }

            _cachingProvider.StoreAutocompleteResult(input, searchResult.Result);

            return(searchResult);
        }
        /// <summary>
        /// Invokes places search webservice
        /// <param name="searchString">Search string</param>
        /// <param name="request">Autocomplete request specifying additional components in the search Url to be generated</param>
        /// <returns>Place result with predictions</returns>
        /// </summary>
        public async Task <OperationResult <PlaceResponse> > SearchAsync(string searchString, AutocompleteRequest request)
        {
            if (string.IsNullOrWhiteSpace(searchString))
            {
                return(OperationResult <PlaceResponse> .AsFailure("PlaceId cannot be empty"));
            }

            var url = _urlFactory.BuildSearchUrl(searchString, request);

            using (var client = new HttpClient())
            {
                AcceptJsonResponse(client);

                var response = await client.GetAsync(url).ConfigureAwait(false);

                if (!response.IsSuccessStatusCode)
                {
                    return(OperationResult <PlaceResponse> .AsFailure(response.ReasonPhrase));
                }

                var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                var result = JsonConvert.DeserializeObject <PlaceResponse>(content);
                return(OperationResult <PlaceResponse> .AsSuccess(result));
            }
        }
        /// <summary>
        /// Invokes <see cref="SearchAsync(string, AutocompleteRequest)"/> with the given <paramref name="autocomleteRequest"/> and caches the results
        /// <param name="input">Search string</param>
        /// <param name="request">Autocomplete request specifying additional components in the search Url to be generated</param>
        /// </summary>
        public async Task <OperationResult <PlaceResponse> > AutocompleteAsync(string input, AutocompleteRequest autocomleteRequest)
        {
            //Get cached results
            var result = _cachingProvider.GetAutocompleteResult(input);

            if (result != null)
            {
                return(OperationResult <PlaceResponse> .AsSuccess(result));
            }

            var searchResult = await SearchAsync(input, new AutocompleteRequest
            {
                Region = "au"
            })
                               .ContinueWith(response =>
            {
                if (response.Result == null)
                {
                    return(OperationResult <PlaceResponse> .AsFailure("Search response result is null"));
                }
                return(response.Result);
            })
                               .ConfigureAwait(false);

            if (searchResult.IsSuccessful)
            {
                _cachingProvider.StoreAutocompleteResult(input, searchResult.Result);
            }

            return(searchResult);
        }
        /// <summary>
        /// Invokes places search webservice
        /// <param name="searchString">Search string</param>
        /// <param name="request">Autocomplete request specifying additional components in the search Url to be generated</param>
        /// <returns>Place result with predictions</returns>
        /// </summary>
        public Task <OperationResult <PlaceResponse> > SearchAsync(string searchString, AutocompleteRequest request)
        {
            if (string.IsNullOrWhiteSpace(searchString))
            {
                Task.Run(() =>
                {
                    return(OperationResult <DetailsResponse> .AsFailure("PlaceId cannot be empty"));
                });
            }

            var url = _urlFactory.BuildSearchUrl(searchString, request);

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Content-Type", "application/json;charset=utf-8");

                return(client.GetStringAsync(url)
                       .ContinueWith(response =>
                {
                    var result = JsonConvert.DeserializeObject <PlaceResponse>(response.Result);
                    return OperationResult <PlaceResponse> .AsSuccess(result);
                }));
            }
        }