[英]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.