如何在C#中调用多个REST API?代码修改方案咨询
多API调用的C#代码修改方案
先修正你代码里的几个关键错误
- 错误的返回类型:
Task<Var>是非法写法,C#里没有Var这个类型,你需要为每个API的响应定义对应的实体类(比如Api1Response、Api2Response),函数返回类型改成Task<Api1Response>、Task<Api2Response>这类明确的类型。 - 异步方法不匹配:你用了
async Task修饰函数,但内部调用的是同步的Execute,应该换成异步的ExecuteAsync,否则异步逻辑根本不起作用。 - 异步方法调用方式:Main方法里直接调用
api2()会导致异步操作被丢弃,需要把Main改成异步方法,用await等待每个API调用完成。
优化后的完整代码示例
首先定义每个API对应的响应实体类(根据实际API返回结构调整,可通过JSON转C#类工具快速生成):
// 对应第一个API的响应结构 public class Api1Response { public List<DataItem> Data { get; set; } public string Status { get; set; } } public class DataItem { public int Id { get; set; } public string Name { get; set; } // 其他字段根据API返回补充 } // 对应第二个API的响应结构(假设和第一个不同) public class Api2Response { public List<OtherData> Items { get; set; } public bool Success { get; set; } } public class OtherData { public string Code { get; set; } public decimal Value { get; set; } // 其他字段根据API返回补充 }
然后修改API调用函数和Main方法:
using RestSharp; using Newtonsoft.Json; class Program { // 复用RestClient,避免重复创建实例(不同域名可分别初始化) private static readonly RestClient _api1Client = new RestClient("https://dummy.restapiexample.com/api/"); private static readonly RestClient _api2Client = new RestClient("https://dummy.restapiexample2.com/api2/"); static async Task Main(string[] args) { try { // 方式1:顺序调用API(逐个等待完成) var api1Result = await CallApi1(); var api2Result = await CallApi2(); // 处理返回结果 if (api1Result != null) { Console.WriteLine($"API1返回数据条数:{api1Result.Data.Count}"); } if (api2Result != null) { Console.WriteLine($"API2返回数据条数:{api2Result.Items.Count}"); } // 方式2:并行调用API(同时发起请求,节省时间) // var task1 = CallApi1(); // var task2 = CallApi2(); // await Task.WhenAll(task1, task2); // var api1ParallelResult = task1.Result; // var api2ParallelResult = task2.Result; } catch (Exception ex) { Console.WriteLine($"请求出错:{ex.Message}"); } } public static async Task<Api1Response> CallApi1() { var request = new RestRequest("Data"); var response = await _api1Client.ExecuteAsync(request); if (response.StatusCode == System.Net.HttpStatusCode.OK && !string.IsNullOrEmpty(response.Content)) { return JsonConvert.DeserializeObject<Api1Response>(response.Content); } else { Console.WriteLine($"API1请求失败,状态码:{response.StatusCode}"); return null; } } public static async Task<Api2Response> CallApi2() { var request = new RestRequest("Data"); var response = await _api2Client.ExecuteAsync(request); if (response.StatusCode == System.Net.HttpStatusCode.OK && !string.IsNullOrEmpty(response.Content)) { return JsonConvert.DeserializeObject<Api2Response>(response.Content); } else { Console.WriteLine($"API2请求失败,状态码:{response.StatusCode}"); return null; } } }
关键说明
- 实体类匹配:必须严格对应API返回的JSON结构,否则反序列化会失败,可借助在线工具快速生成实体类。
- RestClient复用:同一个域名的API只需要初始化一次RestClient,减少资源开销。
- 调用方式选择:顺序调用适合有依赖关系的API(比如第二个API需要第一个的结果),并行调用适合无依赖的场景,能大幅缩短总耗时。
- 错误处理:通过try-catch捕获网络异常,同时检查响应状态码和内容是否为空,避免空引用错误。
内容的提问来源于stack exchange,提问作者Mav
相关产品推荐
相关产品推荐

