2017-02-03 8 views
2

を使用して結果を結合するここでは、私は助けが必要なシナリオです。複数の残りのapi呼び出しを行い、c#

  • ユーザーは、キーワードを入力し、私はHTTPClientの要求を使用して結果を得るために複数のAPIにそのキーワードを提供しています

  • を検索ヒット。

  • さまざまなAPIの検索キーワードに基づいて対応しています。

しかし、私はこれらのapisに1つずつ検索呼び出しを行っています。私は一度ユーザーが検索をヒットすると、すべての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への呼び出しを、共通のモデルを返す非同期関数にカプセル化します。この場合、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を完了したときに結果を収集するタスクのコレクション内のすべてのタスクが完了した時に終了し、単一のタスクを返します。

+0

私は確かにこれを試し、あなたに知らせるでしょう。このコードを出してくれてありがとう。 –

+0

私はjsonで異なる応答を返す異なるAPIを呼び出しています。どのように私はそれらからjsonの応答を1つの形式に結合するのですか?すなわち私はウォルマートとベストアピールのアピスを呼んでいます –

関連する問題