我有一个REST调用来从用于基于Azure的应用程序的小型(145行)EasyTable中提取所有数据。
在提取数据时,响应表明我需要页面来收集所有数据。它一次以50行的方式返回数据。下面的代码收集响应,直到不再返回数据。当我运行它时,第一个响应为我提供了50个唯一的行,并包含一个$top=950&$skip=50
字段用于后续调用。但是,当我进行该调用时,它也返回50行,但有些是前50行的重复。它继续这样直到我得到145行,但由于有些是重复的,我缺少一些行,并且有一些冗余的行。
表中的数据在所有调用期间都是不变的,它每隔几天就会更改一次,并且我确认在我的任何测试期间都没有更改。
我知道我可以重新考虑和简化代码,但我找不到任何可能导致我的问题。任何指针在哪里看?
我尝试使用$filter
并更改$top=200
,但唯一有效的方法是确保过滤器永远不会返回超过50行。不幸的是,由于数据可能会发生变化,因此设置一系列调用会需要额外的字段来查询。如果需要的话,我最终会这样做,但看起来传呼应该可行。
private string AzureTablesStandardGet(string tableURL, string queryString)
{
GetAzuremysite();
CookieContainer cookieJar = new CookieContainer();
string uriQueryString = System.Uri.EscapeUriString(queryString);
string sURL = string.Format("https://mysite.azurewebsites.net/tables{0}?{1}", tableURL, uriQueryString);
WebRequest wrGETURL;
wrGETURL = WebRequest.Create(sURL);
wrGETURL.Proxy = WebRequest.GetSystemWebProxy();
wrGETURL.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
wrGETURL.Headers.Add("ZUMO-API-VERSION", "2.0.0");
wrGETURL.Headers.Add("X-ZUMO-AUTH", mysite.access_token);
wrGETURL.ContentType = "application/json;odata=nometadata";
wrGETURL.Method = "GET";
((HttpWebRequest)wrGETURL).Date = DateTime.UtcNow;
((HttpWebRequest)wrGETURL).CookieContainer = cookieJar;
string sLine = "";
var mine = "first";
try
{
while (mine.Equals("first") || mine.ToLower().Contains("rel=next"))
{
var httpResponse = (HttpWebResponse)wrGETURL.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
string newLine = streamReader.ReadToEnd();
sLine += newLine;
}
mine = httpResponse.GetResponseHeader("Link");
if (mine.ToLower().Contains("rel=next"))
{
string newURL = mine.Split(';')[0];
newURL = newURL.Split('?')[1];
sURL = string.Format("{0}?{1}", sURL.Split('?')[0], newURL);
wrGETURL = WebRequest.Create(sURL);
((HttpWebRequest)wrGETURL).CookieContainer = cookieJar;
wrGETURL.Proxy = WebRequest.GetSystemWebProxy();
wrGETURL.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
wrGETURL.Headers.Add("ZUMO-API-VERSION", "2.0.0");
wrGETURL.Headers.Add("X-ZUMO-AUTH", mysite.access_token);
wrGETURL.ContentType = "application/json;odata=nometadata";
((HttpWebRequest)wrGETURL).Date = DateTime.UtcNow;
wrGETURL.Method = "GET";
}
}
}
catch (WebException e)
{
Console.WriteLine(e.Message);
System.Threading.Thread.Sleep(1000);
}
sLine = sLine.Replace("][",",");
return sLine;
}
}
}
因此,作为一个例子,第一个调用将是:
https://mysite.azurewebsites.net/tables/mytable?$top=1000
和第二个,基于链接头中的响应:
header = http://mysite.azurewebsites.net/?%24top=950&%24skip=50; rel=next
GET call = https://mysite.azurewebsites.net/tables/mytable?%24top=950&%24skip=50
我尝试拨打第一个电话
https://mysite.azurewebsites.net/tables/mytable?$top=1000&$skip=0
但它并没有什么区别
<小时/> 更新2018-04-26
更改代码以手动索引表格,每次50个项目返回所有数据,没有任何重复。现在我真的很困惑。
这个调用序列返回145个项目,但有些是重复项,因此不会返回所有数据。请注意,虽然每个请求请求的行数超过50行,但服务器只返回50行,并且链接标头表示并未返回所有数据,并且它包含我应该使用的参数来获取剩余的数据。
https://mysite.azurewebsites.net/tables/mytable?%24top=1000
https://mysite.azurewebsites.net/tables/mytable?%24top=950&%24skip=50
https://mysite.azurewebsites.net/tables/mytable?%24top=900&%24skip=100
因为我使用Link rel = next not present,所以不需要第四次调用,这意味着停止询问数据
这一系列调用返回所有数据,没有任何重复
https://mysite.azurewebsites.net/tables/mytable?%24top=50&%24skip=0
https://mysite.azurewebsites.net/tables/mytable?%24top=50&%24skip=50
https://mysite.azurewebsites.net/tables/mytable?%24top=50&%24skip=100
然而,它需要第四次调用,返回一个空数组“[]”,我用它来表示我收集了所有信息,我可以停止。
https://mysite.azurewebsites.net/tables/mytable?%24top=50&%24skip=150
由于$top=xx
表示总共要返回多少项,而不是每页,因此调用应该返回相同的结果,但它们不会。