如何在Refit中将序列化后的对象作为query参数传递
问题原因
Refit默认会将标注[Query]特性的复杂类型参数的公共属性展开为独立查询参数,不会自动序列化为JSON字符串作为单个参数值,因此出现你遇到的参数展开问题。
解决方案
方案1(优先推荐,适用于Refit 6.0及以上版本)
直接给eventData参数的[Query]特性指定Format = QueryStringFormat.Json,Refit会自动将该对象序列化为JSON字符串作为event_data的参数值,无需修改其他代码:
[Get("/api.php")] Task<Response> SendAsync([Query][AliasAs("apitoken")] string apiToken, [Query][AliasAs("event_name")] string eventName, [Query(Format = QueryStringFormat.Json)][AliasAs("event_data")] EventData eventData);
方案2(通用兼容所有版本)
将接口参数类型改为字符串,调用前手动将EventData对象序列化为JSON传入:
- 修改接口定义:
[Get("/api.php")] Task<Response> SendAsync([Query][AliasAs("apitoken")] string apiToken, [Query][AliasAs("event_name")] string eventName, [Query][AliasAs("event_data")] string eventDataJson);
- 调用接口前手动序列化:
var eventData = new EventData { UbtcUid = "ckerggrggsg1ini", EventDatetime = new DateTime(2021,7,2,15,36,40), ClientId = "123456" }; // 可使用项目中任意JSON序列化工具,示例为System.Text.Json string json = JsonSerializer.Serialize(eventData); var res = await apiClient.SendAsync("1111", "buy_year", json);
注:Refit会自动对字符串查询参数做URL编码,无需手动处理转义。
方案3(无需修改调用逻辑)
给EventData类重写ToString()方法,内部实现JSON序列化,Refit处理复杂类型查询参数时会默认调用ToString()获取参数值:
public class EventData { [AliasAs("ubtcuid")] public string UbtcUid { get; set; } [AliasAs("event_datetime")] public DateTime EventDatetime { get; set; } [AliasAs("client_id")] public string ClientId { get; set; } public override string ToString() { return JsonSerializer.Serialize(this); } }
注意事项
如果接口要求特定的日期格式(示例中为yyyy-MM-dd HH:mm:ss),需要为EventDatetime属性配置对应的JSON序列化格式规则,避免日期格式不匹配问题。
内容的提问来源于stack exchange,提问作者Tzarek
相关产品推荐
相关产品推荐

