/// <summary>
        /// get string from http client
        /// </summary>
        /// <param name="client"></param>
        /// <param name="url"></param>
        /// <param name="allowAutoRedirect"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public static async Task <string> GetStringAsync(this HttpClient client, ApiUrl url, bool?allowAutoRedirect, params object[] args)
        {
            var referer = client.DefaultRequestHeaders.Referrer;

            if (url.Referer != null)
            {
                client.DefaultRequestHeaders.Referrer = new Uri(url.Referer);
            }

            var response = client.GetStringAsync(url.BuildUrl(args));

            response.Wait();
            // 复原client
            client.DefaultRequestHeaders.Referrer = referer;

            return(await response);
        }
 /// <summary>
 /// get string from http client
 /// </summary>
 /// <param name="client"></param>
 /// <param name="url"></param>
 /// <param name="args"></param>
 /// <returns></returns>
 public static async Task <string> GetStringAsync(this HttpClient client, ApiUrl url, params object[] args)
 => await client.GetStringAsync(url, null, args);
 /// <summary>
 ///     发送GET请求。
 /// </summary>
 /// <param name="client"></param>
 /// <param name="url">URL。</param>
 /// <param name="args">附加的参数。</param>
 /// <returns></returns>
 public static async Task <HttpResponseMessage> GetAsync(this HttpClient client, ApiUrl url, params object[] args)
 => await client.GetAsync(url, null, args);
        /// <summary>
        ///   带重试的发送。
        /// </summary>
        /// <param name="client"></param>
        /// <param name="url"></param>
        /// <param name="json"></param>
        /// <param name="retryTimes"></param>
        /// <returns></returns>
        public static async Task <HttpResponseMessage> PostAsyncWithRetry(this HttpClient client, ApiUrl url, JObject json, int retryTimes)
        {
            Task <HttpResponseMessage> response;

            do
            {
                response = client.PostAsync(url.Url, new StringContent(json.ToString(Formatting.None), Encoding.UTF8, "application/json"));
                response.Wait();
                retryTimes++;
            }while (retryTimes >= 0 && response.Result.StatusCode != System.Net.HttpStatusCode.OK);
            return(await response);
        }
        /// <summary>
        ///     发送POST请求。
        /// </summary>
        /// <param name="client"></param>
        /// <param name="url">URL。</param>
        /// <param name="json">JSON。</param>
        /// <param name="timeout">超时。</param>
        /// <returns></returns>
        public static async Task <HttpResponseMessage> PostAsync(this HttpClient client, ApiUrl url, JObject json, int timeout)
        {
            var hasOrigin = client.DefaultRequestHeaders.TryGetValues("Origin", out IEnumerable <string> origin);

            if (url.Referer != null)
            {
                client.DefaultRequestHeaders.Referrer = new Uri(url.Referer);
            }
            if (client.DefaultRequestHeaders.Contains("Origin"))
            {
                client.DefaultRequestHeaders.Remove("Origin");
                client.DefaultRequestHeaders.Add("Origin", url.Origin);
            }
            else
            {
                client.DefaultRequestHeaders.Add("Origin", url.Origin);
            }

            HttpContent hc = new StringContent($"r={WebUtility.UrlEncode(json.ToString(Formatting.None))}", Encoding.UTF8);

            hc.Headers.ContentType = MediaTypeHeaderValue.Parse("application/ x-www-form-urlencoded; charset=UTF-8");
            var response = client.PostAsync(url.Url, hc);

            response.Wait();

            // 复原client
            if (hasOrigin)
            {
                client.DefaultRequestHeaders.Remove("Origin");
                client.DefaultRequestHeaders.Add("Origin", origin);
            }
            else
            {
                client.DefaultRequestHeaders.Remove("Origin");
            }

            return(await response);
        }
 /// <summary>
 ///     发送POST请求。
 /// </summary>
 /// <param name="client"></param>
 /// <param name="url">URL。</param>
 /// <param name="json">JSON。</param>
 /// <returns></returns>
 public static Task <HttpResponseMessage> PostAsync(this HttpClient client, ApiUrl url, JObject json) => client.PostAsync(url, json, -1);