Пример #1
0
 public ApiResource(string name, IEnumerable <ApiForm> forms, IEnumerable <ApiResource> children, IEnumerable <ApiLink> links, ApiDefinition definition, Func <Type, object> convertState)
 {
     Links         = links;
     Definition    = definition;
     _convertState = convertState;
     Name          = name;
     Forms         = forms.ToDictionary(x => x.Name, x => x);
     Children      = children.GroupBy(x => x.Name).ToDictionary(x => x.Key, x => x.OfType <ApiResource>());
 }
Пример #2
0
        private async Task <ApiResource> GetAsync(Uri uri, IParseApiResponse parser, ApiDefinition definition)
        {
            var response = await _httpClient
                           .Start(uri)
                           .ModifyHeaders(x => x.Accept.Add(new MediaTypeWithQualityHeaderValue(parser.ContentType)))
                           .Send().ConfigureAwait(false);

            _environment.Log("Api request to url: {0} finished with status code: {1}.", LogLevel.Debug, uri, response.StatusCode);

            if (!response.IsSuccessStatusCode)
            {
                return(null);
            }

            return(await parser.Parse(response, definition).ConfigureAwait(false));
        }
Пример #3
0
        public async Task <ApiResource> ExecuteQuery(ApiDefinition definition, IEnumerable <IApiLinkTravelInstruction> instructions, IDictionary <string, object> data)
        {
            var parser = _responseParsers.FirstOrDefault(x => definition.Accepts.Contains(x.ContentType));

            if (parser == null)
            {
                throw new ApiException($"Can't handle api named: {definition.Name}");
            }

            var currentResource = await GetAsync(definition.Location, parser, definition).ConfigureAwait(false);

            if (currentResource == null)
            {
                _environment.Log("Can't find resource for url: {0}.", LogLevel.Error, definition.Location);

                return(null);
            }

            foreach (var instruction in instructions)
            {
                var documentLink = instruction.TravelTo(currentResource);

                var uri = documentLink.Href;

                if (documentLink.Templated)
                {
                    var template = new UriTemplate(uri.ToString());

                    var state = currentResource.StateAs <IDictionary <string, object> >();

                    foreach (var parameterName in template.GetParameterNames())
                    {
                        if (data.ContainsKey(parameterName))
                        {
                            template.SetParameter(parameterName, data[parameterName]);
                        }
                        else if (state.ContainsKey(parameterName))
                        {
                            template.SetParameter(parameterName, state[parameterName]);
                        }
                    }

                    uri = new Uri(template.Resolve(), UriKind.RelativeOrAbsolute);
                }

                if (!uri.IsAbsoluteUri)
                {
                    uri = new Uri(definition.Location.Scheme + Uri.SchemeDelimiter + definition.Location.Host + (definition.Location.IsDefaultPort ? "" : string.Concat(":", definition.Location.Port)) + uri);
                }

                currentResource = await GetAsync(uri, parser, definition).ConfigureAwait(false);

                if (currentResource == null)
                {
                    _environment.Log("Can't find resource for url: {0}.", LogLevel.Error, uri);

                    return(null);
                }
            }

            return(currentResource);
        }