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

如何用RestSharp调用带非必填参数的GET API接口?

解决RestSharp调用ASP.NET Core GET接口时传递非完整对象的问题

核心问题原因

你遇到的AddObject触发验证错误,是因为RestSharp默认会把对象的所有属性(包括未赋值的null/默认值属性)都转换成URL查询参数传递给后端,而你的ASP.NET Core接口模型验证规则会对这些未预期的空值参数抛出错误。

解决方案

方法1:使用AddObject并启用忽略空值参数

RestSharp的AddObject方法提供了ignoreNullValues参数,设置为true后会自动跳过对象中值为null的属性,只传递已赋值的属性作为查询参数,既保持了对象传递的优雅性,又避免触发验证错误。

代码示例:

// 构造只填充部分属性的请求对象
var personRequest = new PersonListRequest { Name = "Alice", City = "New York" };

// 创建GET请求
var request = new RestRequest("/api/persons", Method.Get);
// 添加对象参数并忽略空值
request.AddObject(personRequest, ignoreNullValues: true);

// 执行请求
var client = new RestClient("https://your-api-base-url");
var response = await client.ExecuteAsync(request);

方法2:自定义扩展方法筛选有效参数

如果需要更灵活的参数筛选逻辑(比如跳过默认值而非仅null),可以写一个RestRequest的扩展方法,手动遍历对象属性,只添加符合条件的参数:

public static class RestRequestExtensions
{
    public static RestRequest AddValidQueryParameters(this RestRequest request, object model)
    {
        if (model == null) return request;

        var properties = model.GetType().GetProperties()
            .Where(p => IsPropertyHasValidValue(p.GetValue(model), p.PropertyType));

        foreach (var prop in properties)
        {
            request.AddQueryParameter(prop.Name, prop.GetValue(model)?.ToString());
        }

        return request;
    }

    private static bool IsPropertyHasValidValue(object value, Type propertyType)
    {
        if (value == null) return false;
        
        // 值类型判断是否为默认值(比如int的0、bool的false等)
        if (propertyType.IsValueType)
        {
            var defaultValue = Activator.CreateInstance(propertyType);
            return !value.Equals(defaultValue);
        }
        
        // 引用类型排除空字符串
        if (propertyType == typeof(string))
        {
            return !string.IsNullOrWhiteSpace((string)value);
        }

        return true;
    }
}

使用方式:

var personRequest = new PersonListRequest { Age = 25 }; // 仅填充Age属性
var request = new RestRequest("/api/persons", Method.Get);
request.AddValidQueryParameters(personRequest);

var response = await new RestClient("https://your-api-base-url").ExecuteAsync(request);

补充说明

  • 为什么AddBody/AddJsonBody会报错?HTTP规范中GET请求不应携带请求体,RestSharp严格遵循这一规范,因此GET请求使用这类方法会触发错误,正确做法是将参数放在URL查询字符串中。
  • 若后端允许调整,也可以修改模型验证规则(比如移除不必要的[Required]特性,或配置[Required(AllowEmptyStrings = true)]),但这属于后端调整,优先推荐前端通过RestSharp的参数控制解决问题。

内容的提问来源于stack exchange,提问作者Ashley Kilgour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:10:30