1

我必须通过 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
4

0 回答 0