C# .NET Core使用RestSharp调用含不同类型查询参数的GET API
问题描述
需要调用的API地址为:https://localhost:300/api/vi/Product?center=10&ProdNumber=271,该接口包含两个查询参数:
center:string类型ProdNumber:int类型
使用通用GET端点调用代码时,因参数类型不同,不清楚如何构造请求对象传入这两个参数。现有代码如下:
public RestRequest RestRequestGet<T>(string uri, List<RequestParameterVM> parameter) { var request = new RestRequest(uri, Method.Get); request.AddHeader("content-type", "application/json"); parameter.ForEach(param => request.AddParameter(param.ParameterKey, param.ParameterValue)); return request; } public class RequestParameterVM { public string ParameterKey { get; set; } = null!; public string ParameterValue { get; set; } = null!; } // 调用Get端点 List<RequestParameterVM> requestParameter= new List<RequestParameterVM>(); string url = $"{_configuration[Keys.url]}"; // 不清楚如何构造这两个查询参数传入下方方法 var restClient = new RestClient(); var request = _service.RestRequestGet<List<RequestParameterVM>>(url, requestParameter); RestResponse response = await restClient.ExecuteAsync(request); if (response.Content != null) return JsonConvert.DeserializeObject<order>(response.Content);
解决方案
1. 快速适配现有代码构造参数
RestSharp的AddParameter方法会自动处理参数类型转换,即使传入字符串形式的数值,也能正确生成目标查询参数。直接将int类型的ProdNumber转为字符串后添加到参数列表即可:
List<RequestParameterVM> requestParameter = new List<RequestParameterVM> { new RequestParameterVM { ParameterKey = "center", ParameterValue = "10" }, new RequestParameterVM { ParameterKey = "ProdNumber", ParameterValue = "271" } };
这样调用后,生成的请求会自动带上?center=10&ProdNumber=271的查询参数,完全符合API要求。
2. 优化通用方法(支持多类型参数)
如果后续需要处理更多类型的参数,建议修改现有代码,让参数支持任意类型值,提升方法的健壮性:
第一步:修改RequestParameterVM类
将ParameterValue的类型改为object,支持存储任意类型的参数值:
public class RequestParameterVM { public string ParameterKey { get; set; } = null!; public object ParameterValue { get; set; } = null!; }
第二步:修改RestRequestGet方法
移除不必要的content-type头(GET请求无请求体,不需要该头),并使用AddQueryParameter明确添加查询参数,避免歧义:
public RestRequest RestRequestGet<T>(string uri, List<RequestParameterVM> parameters) { var request = new RestRequest(uri, Method.Get); foreach (var param in parameters) { request.AddQueryParameter(param.ParameterKey, param.ParameterValue); } return request; }
第三步:构造参数时直接传入对应类型
此时可以直接传入int类型的ProdNumber,无需手动转换:
List<RequestParameterVM> requestParameter = new List<RequestParameterVM> { new RequestParameterVM { ParameterKey = "center", ParameterValue = "10" }, new RequestParameterVM { ParameterKey = "ProdNumber", ParameterValue = 271 } };
内容的提问来源于stack exchange,提问作者Ann Snow
相关产品推荐
相关产品推荐

