在 get 请求中传递 json 参数
Pass json params in get requests
我有:
public class Query {...}
public interface IClient
{
[Get("/api/endpoint?data={query}")]
Task<Result> GetData(Query query);
}
但 Query 实例上的 Refit 调用 ToString 而不是使用序列化程序。有没有什么方法可以不使用包装器来实现这一点 class?
如果我对文档的理解正确,唯一的问题就是命名。由于您将其用作参数而不是路径的一部分,因此它更接近于此:
public class Query {...}
public interface IClient
{
[Get("/api/endpoint")]
Task<Result> GetData(Query data);
}
然后像往常一样调用它:
GetData(aQueryObject);
或
http://myhost/api/endpoint?data=somestuff
我最终使用了一个自定义序列化程序,它转换为 JSON 除了基本类型和实现 IConvertible 的类型之外的所有类型:
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()
};
我有:
public class Query {...}
public interface IClient
{
[Get("/api/endpoint?data={query}")]
Task<Result> GetData(Query query);
}
但 Query 实例上的 Refit 调用 ToString 而不是使用序列化程序。有没有什么方法可以不使用包装器来实现这一点 class?
如果我对文档的理解正确,唯一的问题就是命名。由于您将其用作参数而不是路径的一部分,因此它更接近于此:
public class Query {...}
public interface IClient
{
[Get("/api/endpoint")]
Task<Result> GetData(Query data);
}
然后像往常一样调用它:
GetData(aQueryObject);
或
http://myhost/api/endpoint?data=somestuff
我最终使用了一个自定义序列化程序,它转换为 JSON 除了基本类型和实现 IConvertible 的类型之外的所有类型:
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()
};