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>()); }
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)); }
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); }