You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

RestSharp V107版本中RestRequest添加比较逻辑查询参数的技术求助

解决RestSharp V107添加比较逻辑查询参数的问题

针对你在RestSharp V107中无法添加gt/ge/lt/le这类比较逻辑查询参数的困扰,我整理了几种实用的解决方案,适配不同的API参数风格:

方案1:直接传递带操作符的查询参数值

如果你的API允许将操作符和值绑定在一起作为参数值(比如参数key是字段名,值为gt '2020-12-07T08:30:42.483Z'),可以跳出Dictionary的限制,直接调用AddQueryParameter传入完整的键值对。我帮你修改了原有方法,支持同时传入等值匹配和比较逻辑的参数:

修改后的方法示例

public static async Task<string> GET_API(String baseUrl, string resource, 
    Dictionary<string, string> equalParameters = null,
    Dictionary<string, string> comparisonParameters = null) 
{ 
    var request = new RestRequest(resource); 
    var options = new RestClientOptions(baseUrl) { 
        ThrowOnAnyError = true, 
        Timeout = -1 
    }; 
    var client = new RestClient(options); 
    client.Authenticator = new OAuth2AuthorizationRequestHeaderAuthenticator("Bearer " + TokenManager.GetAccessTokenString("TRN")); 

    // 添加等值匹配参数
    if (equalParameters != null)
    {
        foreach (var parameter in equalParameters) { 
            request.AddQueryParameter(parameter.Key, parameter.Value); 
        }
    }

    // 添加带比较逻辑的参数
    if (comparisonParameters != null)
    {
        foreach (var parameter in comparisonParameters) { 
            request.AddQueryParameter(parameter.Key, parameter.Value); 
        }
    }

    var response = await client.GetAsync(request); 
    return response.Content.ToString(); 
}

调用示例

var equalParams = new Dictionary<string, string>
{
    {"dl_document_name", "TableA"}
};

var comparisonParams = new Dictionary<string, string>
{
    {"dl_document_indexed_date", "gt '2020-12-07T08:30:42.483Z'"}
};

var result = await GET_API("https://your-api-base-url", "your-table-name", equalParams, comparisonParams);

RestSharp会自动帮你处理URL编码,避免手动拼接的错误,生成的URL会包含?dl_document_name=TableA&dl_document_indexed_date=gt%20%272020-12-07T08%3A30%3A42.483Z%27

方案2:适配OData风格的$filter参数(如果API支持)

如果你的API遵循OData规范,过滤条件通常通过$filter参数统一传递。这种情况下,你可以构建完整的过滤字符串,再作为单个查询参数添加:

修改后的方法示例

public static async Task<string> GET_API(String baseUrl, string resource, 
    List<string> filterConditions = null) 
{ 
    var request = new RestRequest(resource); 
    var options = new RestClientOptions(baseUrl) { 
        ThrowOnAnyError = true, 
        Timeout = -1 
    }; 
    var client = new RestClient(options); 
    client.Authenticator = new OAuth2AuthorizationRequestHeaderAuthenticator("Bearer " + TokenManager.GetAccessTokenString("TRN")); 

    // 构建OData过滤字符串
    if (filterConditions != null && filterConditions.Any())
    {
        var filter = string.Join(" and ", filterConditions);
        request.AddQueryParameter("$filter", filter);
    }

    var response = await client.GetAsync(request); 
    return response.Content.ToString(); 
}

调用示例

var filters = new List<string>
{
    "dl_document_name eq 'TableA'",
    "dl_document_indexed_date gt '2020-12-07T08:30:42.483Z'"
};

var result = await GET_API("https://your-api-base-url", "your-table-name", filters);

生成的URL会包含?$filter=dl_document_name%20eq%20%27TableA%27%20and%20dl_document_indexed_date%20gt%20%272020-12-07T08%3A30%3A42.483Z%27,完全符合OData的过滤语法。

方案3:手动拼接URL(适配旧习惯,不推荐)

如果你一定要沿用旧版本手动拼接URL的方式,V107中可以直接构建包含查询参数的完整resource路径,不过需要自己处理URL编码:

示例代码

public static async Task<string> GET_API(String baseUrl, string resource, string queryString) 
{ 
    // 拼接resource和查询参数
    var fullResource = string.IsNullOrEmpty(queryString) ? resource : $"{resource}?{queryString}";
    var request = new RestRequest(fullResource); 
    var options = new RestClientOptions(baseUrl) { 
        ThrowOnAnyError = true, 
        Timeout = -1 
    }; 
    var client = new RestClient(options); 
    client.Authenticator = new OAuth2AuthorizationRequestHeaderAuthenticator("Bearer " + TokenManager.GetAccessTokenString("TRN")); 

    var response = await client.GetAsync(request); 
    return response.Content.ToString(); 
}

调用示例

var rawQuery = "dl_document_name eq 'TableA'&dl_document_indexed_date gt '2020-12-07T08:30:42.483Z'";
// 手动处理URL编码,避免请求失败
var encodedQuery = System.Web.HttpUtility.UrlEncode(rawQuery);
var result = await GET_API("https://your-api-base-url", "your-table-name", encodedQuery);

⚠️ 注意:手动拼接容易出现编码错误,优先推荐方案1或方案2。

内容的提问来源于stack exchange,提问作者Samuel Dague

火山引擎 最新活动