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