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

如何在C#中调用多个REST API?代码修改方案咨询

多API调用的C#代码修改方案

先修正你代码里的几个关键错误

  1. 错误的返回类型:Task<Var>是非法写法,C#里没有Var这个类型,你需要为每个API的响应定义对应的实体类(比如Api1Response、Api2Response),函数返回类型改成Task<Api1Response>、Task<Api2Response>这类明确的类型。
  2. 异步方法不匹配:你用了async Task修饰函数,但内部调用的是同步的Execute,应该换成异步的ExecuteAsync,否则异步逻辑根本不起作用。
  3. 异步方法调用方式: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:25:26