2016-01-13 32 views
0

我正在嘗試對AtTask RESTful API進行Get請求以獲取1000個項目對象。 ATask API documentation給出了一些關於如何做到這一點的提示。我需要對我要請求的對象數進行分頁。想象一下,我需要抓取過去7天內可用的任何對象,但我不知道對象的確切數量,因此我如何更改以下代碼來實現此目的,所以我不知道應該是什麼值我的分頁,我不知道,如果我可以遞歸發送Get請求,直到所有的數據被提取。通過AtTask RESTful API獲取和分頁所有數據

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; 
    } 

回答

2

您需要首先調用COUNT來獲取您正在處理的對象數量的值。 這與/ search相同,但使用/ count而不是搜索。

例如

GET /attask/api/v4.0/proj/count?status=cur 

你可以再通過使用$$第一頁和拉你的結果。

你的代碼看起來comething這樣

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

相關問題