通过 AtTask 获取和分页所有数据 RESTful API
Fetching and paginating all data by AtTask RESTful API
我正在尝试向 AtTask RESTful API 发出 Get 请求以获取 1000 个项目对象。 ATask API documentation 给出了一些关于如何做到这一点的提示。我需要对我要请求的对象数量进行分页。想象一下,我需要获取过去 7 天内可用的任何对象,我如何更改以下代码来实现此目的,因为我不知道对象的确切数量,所以我不知道值应该是多少我的分页,我不确定是否可以递归发送 Get 请求直到获取所有数据。
public JToken Search( ObjCode objcode, object parameters, int limit = 100 )
{
VerifySignedIn();
string[] p = parameterObjectToStringArray(parameters, "sessionID=" + SessionID);
JToken json = null;
if (limit > 100)
{
json = client.DoGet(string.Format("/{0}/search?$$LIMIT={1}", objcode,limit),limit,p);
}
else
{
json = client.DoGet(string.Format("/{0}/search", objcode),limit,p);
}
return json;
}
public JToken DoGet(string path,int limit = 100 ,params string[] parameters)
{
return DoRequest(path,limit ,parameters);
}
public JToken DoRequest(string path,int limit, params string[] parameters)
{
if (!path.StartsWith("/"))
{
path = "/" + path;
}
string fullUrl = url + path + ToQueryString(parameters,limit);
if (DebugUrls) Console.WriteLine("Requesting: {0}", fullUrl);
WebRequest request = HttpWebRequest.CreateDefault(new Uri(fullUrl));
using (WebResponse response = request.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
return ReadResponse(responseStream);
}
}
}
private string ToQueryString(string[] parameters, int limit = 100)
{
StringBuilder sb = new StringBuilder();
parameters.ToList().ForEach(s => sb.Append(s).Append("&"));
if (sb.Length > 0)
{
sb.Remove(sb.Length - 1, 1);
}
return limit > 100 ? "&" + sb : "?" + sb;
}
您需要先调用 COUNT 来获取您正在处理的对象数量的值。
这与 /search 的方式相同,但使用 /count 而不是 search。
例子
GET /attask/api/v4.0/proj/count?status=cur
然后您可以使用 $$FIRST 翻页并提取结果。
你的代码看起来像这样
public JToken Search( ObjCode objcode, object parameters, int limit = 100 )
{
VerifySignedIn();
string[] p = parameterObjectToStringArray(parameters, "sessionID=" + SessionID);
JToken json = null;
JToken count = null;
count = client.DoGet(string.Format("/{0}/count", objcode),limit,p);
for(int i=0; i<count; i+limit){
if (limit > 100)
{
json = client.DoGet(string.Format("/{0}/search?$$LIMIT={1}&$$FIRST={2}", objcode,limit,i),limit,p);
}
else
{
json = client.DoGet(string.Format("/{0}/search&$$FIRST={1}", objcode,i),limit,p);
}
return json;
}
}
可以找到此信息https://developers.workfront.com/api-docs/#PaginatedResponses
我正在尝试向 AtTask RESTful API 发出 Get 请求以获取 1000 个项目对象。 ATask API documentation 给出了一些关于如何做到这一点的提示。我需要对我要请求的对象数量进行分页。想象一下,我需要获取过去 7 天内可用的任何对象,我如何更改以下代码来实现此目的,因为我不知道对象的确切数量,所以我不知道值应该是多少我的分页,我不确定是否可以递归发送 Get 请求直到获取所有数据。
public JToken Search( ObjCode objcode, object parameters, int limit = 100 )
{
VerifySignedIn();
string[] p = parameterObjectToStringArray(parameters, "sessionID=" + SessionID);
JToken json = null;
if (limit > 100)
{
json = client.DoGet(string.Format("/{0}/search?$$LIMIT={1}", objcode,limit),limit,p);
}
else
{
json = client.DoGet(string.Format("/{0}/search", objcode),limit,p);
}
return json;
}
public JToken DoGet(string path,int limit = 100 ,params string[] parameters)
{
return DoRequest(path,limit ,parameters);
}
public JToken DoRequest(string path,int limit, params string[] parameters)
{
if (!path.StartsWith("/"))
{
path = "/" + path;
}
string fullUrl = url + path + ToQueryString(parameters,limit);
if (DebugUrls) Console.WriteLine("Requesting: {0}", fullUrl);
WebRequest request = HttpWebRequest.CreateDefault(new Uri(fullUrl));
using (WebResponse response = request.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
return ReadResponse(responseStream);
}
}
}
private string ToQueryString(string[] parameters, int limit = 100)
{
StringBuilder sb = new StringBuilder();
parameters.ToList().ForEach(s => sb.Append(s).Append("&"));
if (sb.Length > 0)
{
sb.Remove(sb.Length - 1, 1);
}
return limit > 100 ? "&" + sb : "?" + sb;
}
您需要先调用 COUNT 来获取您正在处理的对象数量的值。 这与 /search 的方式相同,但使用 /count 而不是 search。
例子
GET /attask/api/v4.0/proj/count?status=cur
然后您可以使用 $$FIRST 翻页并提取结果。
你的代码看起来像这样
public JToken Search( ObjCode objcode, object parameters, int limit = 100 )
{
VerifySignedIn();
string[] p = parameterObjectToStringArray(parameters, "sessionID=" + SessionID);
JToken json = null;
JToken count = null;
count = client.DoGet(string.Format("/{0}/count", objcode),limit,p);
for(int i=0; i<count; i+limit){
if (limit > 100)
{
json = client.DoGet(string.Format("/{0}/search?$$LIMIT={1}&$$FIRST={2}", objcode,limit,i),limit,p);
}
else
{
json = client.DoGet(string.Format("/{0}/search&$$FIRST={1}", objcode,i),limit,p);
}
return json;
}
}
可以找到此信息https://developers.workfront.com/api-docs/#PaginatedResponses