6

我有:

public class Query {...}
public interface IClient
{
    [Get("/api/endpoint?data={query}")]
    Task<Result> GetData(Query query);
}

但 Query 实例上的 Refit 调用 ToString 而不是使用序列化程序。有没有办法在不使用包装类的情况下实现这一点?

4

2 回答 2

1

我最终使用了一个自定义序列化程序,它将除了原始类型和实现 IConvertible 的所有类型之外的所有类型都转换为 JSON:

class DefaultUrlParameterFormatter : IUrlParameterFormatter
{
    public string Format(object value, ParameterInfo parameterInfo)
    {
        if (value == null)
            return null;

        if (parameterInfo.ParameterType.IsPrimitive)
            return value.ToString();

        var convertible = value as IConvertible; //e.g. string, DateTime
        if (convertible != null)
            return convertible.ToString();

        return JsonConvert.SerializeObject(value);
    }
}

var settings = new RefitSettings
{
    UrlParameterFormatter = new DefaultUrlParameterFormatter()
};
于 2016-02-24T13:47:59.153 回答
1

如果我正确理解文档,唯一的问题是命名。由于您将其用作参数而不是路径的一部分,因此它更接近于:

public class Query {...}
public interface IClient
{
    [Get("/api/endpoint")]
    Task<Result> GetData(Query data);
}

然后像往常一样调用它:

GetData(aQueryObject);

或者

http://myhost/api/endpoint?data=somestuff
于 2015-11-21T18:10:47.253 回答