2017-03-21 1 views
1

私はAPIをHttpClientで呼び出し、CustomersのリストをIEnumberable<Customer>としてビルドする方法があります。このAPIが動作する方法は、一度に100人の顧客しか返さず、次の100を再度取得するためにJSONコンテンツに別のリンクを提供することです。C#を呼び出してWebからJSONデータを取得するループを待ちます

このコードを構造化して、大量のIEnumerable<Customer>を構築し、このメソッドから戻ります。この大きな方法を別の小さな方法に壊すことは大丈夫です。私は同期プロセスを望んでいません。

Task<IEnumerable<Customer>> GetCustomers(string url) 
{ 
    HttpClient client = new HttpClient(); 
    HttpResponseMessage response = await client.GetAsync(url); 
    response.EnsureSuccessStatusCode(); 
    string responseBody = await response.Content.ReadAsStringAsync(); 

    // TODO: Deserialize responseBody and build a new IEnumerable<Customer> 
} 

JSON:

{ 
    "nextRecords": "\\customers\\123", 
    "customers": [ 
     {"name": "John Doe"}, 
     {"name": "Mary Doe"} 
    ] 
} 

答えて

1

サンプルJSONから、次のモデルが導出されています。

public class RootObject { 
    public string nextRecords { get; set; } 
    public IList<Customer> customers { get; set; } 
} 

public class Customer { 
    public string name { get; set; } 
} 

結果を使用して行うことができましょう

HttpClient client = new HttpClient(); 
async Task<IEnumerable<Customer>> GetCustomers(string url) { 
    var result = new List<Customer>(); 
    do { 
     var response = await client.GetAsync(url); 

     response.EnsureSuccessStatusCode(); 

     var body = await response.Content.ReadAsAsync<RootObject>(); 

     result.AddRange(body.customers); 

     url = body.nextRecords; 
    } while(!string.IsNullOrWhitespace(url)); 

    return result;   
} 
関連する問題