You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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传入:

  1. 修改接口定义:
[Get("/api.php")]
Task<Response> SendAsync([Query][AliasAs("apitoken")] string apiToken,
            [Query][AliasAs("event_name")] string eventName,
            [Query][AliasAs("event_data")] string eventDataJson);
  1. 调用接口前手动序列化:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:39:00