2017-02-03 1 views
2

Вот сценарий, где мне нужна помощь.сделать несколько вызовов api для отдыха и комбинировать результат с помощью C#

  • Пользователь вводит ключевое слово и нажмите поиск

  • Я при условии, что ключевое слово в нескольких API, чтобы получить результаты, используя HTTPClient запрос.

  • Я получаю ответ на основе ключевого слова поиска из разных 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"); 
    }     
} 

как только я получу результат, я совмещаю список и возвращаю его, что я не думаю, что это лучшая практика.

Я знаю, что могу использовать многозадачные потоки, но у меня нет практических примеров для подражания. Может ли кто-нибудь предложить лучший подход к этому?

+2

Несколько запросов параллельно и объединить результаты. https://msdn.microsoft.com/en-us/library/hh696703(v=vs.110).aspx – JamesT

+0

По крайней мере, предоставьте некоторый код, как вы это делаете сейчас. – Evk

+0

Это был бы ответный вопрос, если бы вы предоставили некоторый код, чтобы показать, как вы в настоящее время выполняете вызовы API. «многозадачные потоки» не были бы правильным подходом. – spender

ответ

3

Вот такой подход, который вы можете предпринять.

Инкапсулируйте вызовы к различным API-интерфейсам в функции async, которые возвращают общую модель. В этом случае используется общий метод, который будет возвращать WalmartModel после запроса URL-адреса.

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 возвращает одну задачу, которая заканчивается, когда все задачи в коллекции задач завершена.

+0

Я обязательно попробую это и дам вам знать. Спасибо, что выпустили этот код. –

+0

Я называю разные API, которые возвращают разные ответы в json. Как объединить ответ json от них в один формат? я звоню walmart и лучше всего покупаю apis –

Смежные вопросы