mirror of https://github.com/abpframework/abp.git
8 changed files with 129 additions and 86 deletions
@ -0,0 +1,82 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using Volo.Abp.Http.Modeling; |
|||
using Volo.Abp.Reflection; |
|||
|
|||
namespace Volo.Abp.Http.Client.DynamicProxying |
|||
{ |
|||
internal static class UrlBuilder |
|||
{ |
|||
public static string GenerateUrlWithParameters(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments) |
|||
{ |
|||
var urlBuilder = new StringBuilder(action.Url); |
|||
|
|||
ReplacePathVariables(urlBuilder, action.Parameters, methodArguments); |
|||
AddQueryStringParameters(urlBuilder, action.Parameters, methodArguments); |
|||
|
|||
return urlBuilder.ToString(); |
|||
} |
|||
|
|||
private static void ReplacePathVariables(StringBuilder urlBuilder, IList<ParameterApiDescriptionModel> actionParameters, IReadOnlyDictionary<string, object> methodArguments) |
|||
{ |
|||
var pathParameters = actionParameters |
|||
.Where(p => p.BindingSourceId == "Path") |
|||
.ToArray(); |
|||
|
|||
if (!pathParameters.Any()) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
foreach (var pathParameter in pathParameters) |
|||
{ |
|||
urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", FindParameterValue(methodArguments, pathParameter)); |
|||
} |
|||
} |
|||
|
|||
private static void AddQueryStringParameters(StringBuilder urlBuilder, IList<ParameterApiDescriptionModel> actionParameters, IReadOnlyDictionary<string, object> methodArguments) |
|||
{ |
|||
var queryStringParameters = actionParameters |
|||
.Where(p => p.BindingSourceId.IsIn("ModelBinding", "Query")) |
|||
.ToArray(); |
|||
|
|||
if (!queryStringParameters.Any()) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
var isFirstParam = true; |
|||
foreach (var queryStringParameter in queryStringParameters) |
|||
{ |
|||
var value = FindParameterValue(methodArguments, queryStringParameter); |
|||
if (value == null) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
urlBuilder.Append(isFirstParam ? "?" : "&"); |
|||
urlBuilder.Append(queryStringParameter.Name + "=" + System.Net.WebUtility.UrlEncode(value)); |
|||
|
|||
isFirstParam = false; |
|||
} |
|||
} |
|||
|
|||
private static string FindParameterValue(IReadOnlyDictionary<string, object> methodArguments, ParameterApiDescriptionModel apiParameter) |
|||
{ |
|||
var value = methodArguments[apiParameter.NameOnMethod]; |
|||
if (value == null) |
|||
{ |
|||
return null; |
|||
} |
|||
|
|||
if (apiParameter.Name == apiParameter.NameOnMethod) |
|||
{ |
|||
return value.ToString(); |
|||
} |
|||
|
|||
return ReflectionHelper.GetValueByPath(value, value.GetType(), apiParameter.Name)?.ToString(); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue