Как отправить объект, который содержит IEnumerable через Refit на NetCore? - PullRequest
0 голосов
/ 05 июня 2019

Я должен отправить объект запроса через Refit, который содержит 2 IEnumerable и одну строку, но по какой-то причине я не могу отправить объект вперед.

Я пытался использовать все параметры изинтерфейс.Пример: [Query (CollectionFormat.Csv)] или Multi / Pipes, но безуспешно.

Я также пытался создать свой собственный CustomUrlParameterFormatter, но, к сожалению, здесь я застрял, потому что не вижу хорошего способа извлечь имя свойства из запроса объекта, который я отправляю.

Код для CustomUrlParameterFormatter

public class CustomUrlParameterFormatter : IUrlParameterFormatter
    {
        public string Format(object value, ParameterInfo parameterInfo)
        {
            if(value is IEnumerable enumerable)
            {
                var result = ToQueryString(enumerable, parameterInfo.Name);
                return result;
            }

            return string.Empty;
        }

        public static string ToQueryString(IEnumerable query, string parameterName)
        {
            var values = query.Cast<object>().Select(ToString).ToArray();
            var separator = parameterName + "=";

            return values.Any() ? separator + string.Join("&" + separator, values) : "";
        }

        public static string ToString(object value)
        {
            var json = JsonConvert.SerializeObject(value).Replace("\\\"", "\"").Trim('"');

            return Uri.EscapeUriString(json);
        }


    }   

Вызов от IService, который я использую

        [Get("/TestMethod")]        
        Task<HttpResponseMessage> TestMethod([Query]TestRequestDTO requestDTO, [Header("X-Correlation-ID")] string correlationId);

Объект запроса

    public class TestRequestDTO
    {   
        public IEnumerable<long> EnumOne { get; set; }
        public IEnumerable<long> EnumTwo { get; set; }
        public string MethodString { get; set; }
    }

Также конфигурация RefitClient

var refitSettings = new RefitSettings();
            refitSettings.UrlParameterFormatter = new CustomUrlParameterFormatter();

services.AddRefitClient<IService>(refitSettings)
                .ConfigureHttpClient(c => c.BaseAddress = new Uri(settings.Services.IService));

Я пытаюсь добиться чего-то вроде

TestMethod?EnumOne =123&EnumOne =321&EnumTwo=123&EnumTwo=321&methodString=asdsaa

, и вместо этого я получаю другое поведение без CustomUrlParameterFormatter ()

TestMethod?EnumOne=System.Collections.Generic.List`1%5BSystem.Int64%5D&EnumTwo=System.Collections.Generic.List`1%5BSystem.Int64%5D&MethodString=sdf
...