c# - 进行多个 rest api 调用并使用 c# 组合结果

标签 c# multithreading asp.net-web-api2

<分区>

这是我需要帮助的场景。

  • 用户输入关键字并点击搜索

  • 我正在向多个 API 提供该关键字,以便使用 httpclient 请求获得结果。

  • 我收到基于来自不同 API 的搜索关键字的响应。

但问题是我正在对这些 API 进行一个一个的搜索调用。我想做一些事情,一旦用户点击搜索,它就会立即调用所有 API,然后合并结果。

WalmartModel model=new WalmartModel();

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("**URL 1**");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    //GET Method  
    HttpResponseMessage response = await client.GetAsync("");
    if (response.IsSuccessStatusCode)
    {
        model = await response.Content.ReadAsAsync<WalmartModel>();
    }
    else
    {
        Console.WriteLine("Internal server Error");
    }                
}


using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("**URL 2**");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    //GET Method  
    HttpResponseMessage response = await client.GetAsync("");
    if (response.IsSuccessStatusCode)
    {
        model = await response.Content.ReadAsAsync<WalmartModel>();
    }
    else
    {
        Console.WriteLine("Internal server Error");
    }                
}

一旦我得到结果,我就会合并列表并返回它。(我认为这不是要遵循的最佳实践。)

我知道我可以利用多任务线程,但我没有可遵循的实际示例。任何人都可以建议处理此问题的最佳方法吗?

最佳答案

这是您可以采用的一种方法。

将对不同 API 的调用封装到返回通用模型的异步函数中。在这种情况下,一个常用方法将在查询 URL 后返回 WalmartModel

public async Task<WalmartModel> GetModel(string url, HttpClient client) {
    //GET Method  
    using(var response = await client.GetAsync(url)) {
        if (response.IsSuccessStatusCode) {
            return await response.Content.ReadAsAsync<WalmartModel>();
        } else {
            Console.WriteLine("Internal server Error");
        }
    }         
    return null;       
}

使用 Task.WhenAll等待所有 API 搜索并在它们完成时收集结果

//Using a single client to make the calls.
using(var client = new HttpClient()) {
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    //create the search tasks to be executed
    var tasks = new []{
        GetModel("**URL 1**", client),
        GetModel("**URL 2**", client),
        GetModel("**URL N**", client),
    };

    // Await the completion of all the running tasks. 
    var responses = await Task.WhenAll(tasks); // returns IEmumerable<WalmartModel>

    var results = responses.Where(r => r != null); //filter out any null values
}

Task.WhenAll 返回一个任务,该任务在任务集合中的所有任务都完成时完成。

关于c# - 进行多个 rest api 调用并使用 c# 组合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42025030/

相关文章:

c# - 为什么以这种方式转换为类型不是有效语法?

java Timer TimerTask多线程

c# - 只读静态字段初始化的线程安全

c# - webapi 5.2.3 发现多个 Controller 类型匹配 URL - 属性路由

c# - 从 web api 2 获取值时出现 Json 解析错误

c# - 如何声明类的 List 属性的获取和设置访问器

c# - 可扩展的 ASP.NET MVC Web 应用程序

c# - 难以使用 JQuery 设置自定义 DDL 的值

javascript - 了解 JavaScript 的单线程特性

asp.net-web-api - 在单个请求中发布或放置多个项目