Exemplo n.º 1
0
        public async Task <IHttpResponse> ExecuteForm(IFormTravelInstruction travelToForm, IDictionary <string, object> data)
        {
            var resource = await Query(data).ConfigureAwait(false);

            return(await _executeApiRequests.ExecuteForm(resource, travelToForm, data).ConfigureAwait(false));
        }
Exemplo n.º 2
0
        public async Task <IHttpResponse> ExecuteForm(ApiResource resource, IFormTravelInstruction travelInstruction, IDictionary <string, object> data)
        {
            var form       = travelInstruction.TravelTo(resource);
            var definition = resource.Definition;

            var formData = new Dictionary <string, object>();

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

            foreach (var item in form.Schema)
            {
                if (data.ContainsKey(item.Key))
                {
                    formData[item.Key] = data[item.Key];
                }
                else if (state.ContainsKey(item.Key))
                {
                    formData[item.Key] = state[item.Key];
                }
                else
                {
                    formData[item.Key] = item.Value;
                }
            }

            var uri = form.Action;

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

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

            var request = _httpClient
                          .Start(uri)
                          .Method(form.Method)
                          .ModifyHeaders(x =>
            {
                foreach (var header in (form.Headers ?? new Dictionary <string, string>()))
                {
                    x.Add(header.Key, header.Value);
                }
            });

            if (!string.IsNullOrEmpty(form.Type))
            {
                request = request.ContentType(form.Type);
            }

            request = formData
                      .Aggregate(request, (current, item) => current.Parameter(item.Key, item.Value));

            var response = await request.Send().ConfigureAwait(false);

            if (!response.IsSuccessStatusCode)
            {
                _environment.Log("Execution of form at: {0} returned status code: {1}.", LogLevel.Error, uri, response.StatusCode);
            }

            return(response);
        }