using System.Web;
public class HttpHelper
{
public static string UrlDecode(string input) => HttpUtility.UrlDecode(input);
public static string UrlEncode(string input) => HttpUtility.UrlEncode(input);
}
public class UrlQueryBuilder
{
private IDictionary<string, string> qry = new Dictionary<string, string>();
public UrlQueryBuilder Set(string key, object value)
{
if (value is DateTime)
value = ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss");
qry[key] = value.ToString();
return this;
}
public string Build()
{
if (!qry.Any()) return string.Empty;
return string.Join("&", qry.Select(x => string.Join("=", x.Key, HttpHelper.UrlEncode(x.Value))));
}
}
private RestApiClient GetRestApiClient(string apiKey)
{
string userName = apiKey;
string password = "";
string webserviceApiUrl = "https://test.com/api/";
RestApiClient client = new RestApiClient(webserviceApiUrl, new NetworkCredential(userName, password));
return client;
}
private async Task CheckRateLimit(HttpResponseMessage response)
{
if (response.Headers.Contains("X-RateLimit-Remaining"))
{
var rateLimit = int.Parse(response.Headers.GetValues("X-RateLimit-Limit").FirstOrDefault());
var rateLimitRemaining = int.Parse(response.Headers.GetValues("X-RateLimit-Remaining").FirstOrDefault());
if (rateLimitRemaining < 10)
await Task.Delay(5000); // wait some time to prevent hitting the limit
}
}
private async Task<T> GetSingle<T>(string apiKey, string path)
{
using (var client = GetRestApiClient(apiKey))
{
var response = await client.Get<T>($"{path}");
await CheckRateLimit(response.Response);
return response.Result;
}
}
private async Task<IEnumerable<T>> GetPaged<T>(string apiKey, string path, QueryBuilder query = null)
{
if (query == null)
query = new QueryBuilder();
using (var client = GetRestApiClient(apiKey))
{
var allItems = new List<T>();
var page = 0;
var pageSize = 100;
var hasMore = true;
while (hasMore)
{
var offset = page * pageSize;
if (offset > 0)
query.Set("offset", offset);
var response = await client.Get<IList<T>>($"{path}?{query.Build()}");
await CheckRateLimit(response.Response);
hasMore = response.Result.Count == pageSize;
allItems.AddRange(response.Result);
page++;
}
return allItems;
}
}
267200cookie-checkUrlQueryBuilder