public static HttpContent BuildContent(ActionApiDescriptionModel action, IReadOnlyDictionary <string, object> methodArguments, IJsonSerializer jsonSerializer, ApiVersionInfo apiVersion) { var body = GenerateBody(action, methodArguments, jsonSerializer); if (body != null) { return(new StringContent(body, Encoding.UTF8, MimeTypes.Application.Json)); } body = GenerateFormPostData(action, methodArguments); if (body != null) { return(new StringContent(body, Encoding.UTF8, MimeTypes.Application.XWwwFormUrlencoded)); } return(null); }
private static void AddQueryStringParameters(StringBuilder urlBuilder, IList <ParameterApiDescriptionModel> actionParameters, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion) { var queryStringParameters = actionParameters .Where(p => p.BindingSourceId.IsIn(ParameterBindingSources.ModelBinding, ParameterBindingSources.Query)) .ToArray(); var isFirstParam = true; foreach (var queryStringParameter in queryStringParameters) { var value = HttpActionParameterHelper.FindParameterValue(methodArguments, queryStringParameter); if (value == null) { continue; } AddQueryStringParameter(urlBuilder, isFirstParam, queryStringParameter.Name, value); isFirstParam = false; } if (apiVersion.ShouldSendInQueryString()) { AddQueryStringParameter(urlBuilder, isFirstParam, "api-version", apiVersion.Version); //TODO: Constant! } }
public static string GenerateUrlWithParameters(ActionApiDescriptionModel action, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion) { var urlBuilder = new StringBuilder(action.Url); ReplacePathVariables(urlBuilder, action.Parameters, methodArguments, apiVersion); AddQueryStringParameters(urlBuilder, action.Parameters, methodArguments, apiVersion); return(urlBuilder.ToString()); }
private static void ReplacePathVariables(StringBuilder urlBuilder, IList <ParameterApiDescriptionModel> actionParameters, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion) { var pathParameters = actionParameters .Where(p => p.BindingSourceId == ParameterBindingSources.Path) .ToArray(); if (!pathParameters.Any()) { return; } if (pathParameters.Any(p => p.Name == "apiVersion")) { urlBuilder = urlBuilder.Replace("{apiVersion}", apiVersion.Version); } foreach (var pathParameter in pathParameters.Where(p => p.Name != "apiVersion")) //TODO: Constant! { var value = HttpActionParameterHelper.FindParameterValue(methodArguments, pathParameter); if (value == null) { if (pathParameter.IsOptional) { urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", ""); } else if (pathParameter.DefaultValue != null) { urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", pathParameter.DefaultValue.ToString()); } else { throw new PlusException($"Missing path parameter value for {pathParameter.Name} ({pathParameter.NameOnMethod})"); } } else { urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", value.ToString()); } } }
protected virtual void AddHeaders(IPlusMethodInvocation invocation, ActionApiDescriptionModel action, HttpRequestMessage requestMessage, ApiVersionInfo apiVersion) { //API Version if (!apiVersion.Version.IsNullOrEmpty()) { //TODO: What about other media types? requestMessage.Headers.Add("accept", $"{MimeTypes.Text.Plain}; v={apiVersion.Version}"); requestMessage.Headers.Add("accept", $"{MimeTypes.Application.Json}; v={apiVersion.Version}"); requestMessage.Headers.Add("api-version", apiVersion.Version); } //Header parameters var headers = action.Parameters.Where(p => p.BindingSourceId == ParameterBindingSources.Header).ToArray(); foreach (var headerParameter in headers) { var value = HttpActionParameterHelper.FindParameterValue(invocation.ArgumentsDictionary, headerParameter); if (value != null) { requestMessage.Headers.Add(headerParameter.Name, value.ToString()); } } //CorrelationId requestMessage.Headers.Add(PlusCorrelationIdOptions.HttpHeaderName, CorrelationIdProvider.Get()); //TenantId if (CurrentTenant.Id.HasValue) { //TODO: Use PlusAspNetCoreMultiTenancyOptions to get the key requestMessage.Headers.Add(TenantResolverConsts.DefaultTenantKey, CurrentTenant.Id.Value.ToString()); } //Culture //TODO: Is that the way we want? Couldn't send the culture (not ui culture) var currentCulture = CultureInfo.CurrentUICulture.Name ?? CultureInfo.CurrentCulture.Name; if (!currentCulture.IsNullOrEmpty()) { requestMessage.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(currentCulture)); } //X-Requested-With requestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest"); }