簡體   English   中英

如何在C#等待調用中使用Rx從Web檢索JSON數據

[英]How can I use Rx with C# await calls to retrieve JSON data from web

我有一種方法,可以使用HttpClient調用API並以IEnumberable<Customer>形式IEnumberable<Customer> 該API的工作方式是一次僅返回100個客戶,並在JSON內容中提供另一個鏈接以再次獲取下一個100個客戶。

如何構造此代碼以迭代方式獲取記錄,直到獲取所有記錄,並構建一個大的IEnumerable<Customer>並從此方法返回。 我正在尋找Rx解決方案。

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'
        }
        ]
}

我已將簽名從Task<IEnumerable<Customer>>更改為IObservable<Customer> ,以使其更像Rx。

您需要定義Func<JObject, IObservable<Customer>> createCustomers函數。

嘗試一下:

IObservable<Customer> GetCustomers(string url)
{
    Func<JObject, IObservable<Customer>> createCustomers = jo => { ... };
    return Observable.Create<Customer>(o =>
    {
        var final_url = url + "\\customers";
        return
            Observable
                .While(
                    () => final_url != url,
                    Observable
                        .Using(
                            () => new HttpClient(),
                            client =>
                                from x in Observable.FromAsync(() => client.GetAsync(final_url))
                                from y in Observable.Start(() =>
                                {
                                    x.EnsureSuccessStatusCode();
                                    return x;
                                })
                                from z in Observable.FromAsync(() => y.Content.ReadAsStringAsync())
                                from w in Observable.Start(() =>
                                {
                                    var j = JObject.Parse(z);
                                    final_url = url + j.Property("nextRecords").Value;
                                    return createCustomers(j);
                                })
                                from v in w
                                select v))
                .Subscribe(o);
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM