首页 > 解决方案 > 程序关闭而不是从 API 获取信息

问题描述

好的,所以我对编码还是很陌生,而且大多只知道基础知识。我从未使用过 API。我正在尝试制作一个程序,从 PewDiePie 和 Cocomelon 获取潜艇数量并进行比较。

namespace PewdiepieVsCoco
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var len = args?.Length;

                if (len == null || len.Value == 0)
                {
                    PrintStart();
                    return;
                }

                var pdpSubCount = args[0];
                var pdpSub = GetPDPSubcount(pdpSubCount).Result;

                PrintPDPResult(pdpSub);

            }

            catch (AggregateException agg)
            {
                foreach (var e in agg.Flatten().InnerExceptions)
                    Console.WriteLine(e.Message);
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadKey();
        }

        private static async Task<dynamic> GetPDPSubcount(string pdpSubCount)
        {
            var parameters = new Dictionary<String, String>
            {
                ["key"] = ConfigurationManager.AppSettings["APIKey"],
                ["channelsId"] = "UC-lHJZR3Gqxm24_Vd_AJ5Yw",
                ["part"] = "statistics",
                ["forUsername"] = "PewDiePie",
                ["fields"] = "items/statistics(subscriberCount)"
            };

            var baseUrl = "https://www.googleapis.com/youtube/v3/channels";
            var fullUrl = MakeUrlWithQuery(baseUrl, parameters);

            var pdpSub =  await new HttpClient().GetStringAsync(fullUrl);
            if (pdpSub != null)
            {
                //Does the thing
                return JsonConvert.DeserializeObject(pdpSubCount);
            }

            return default(dynamic);
        }

        private static string MakeUrlWithQuery(string baseUrl, 
            IEnumerable<KeyValuePair<string, string>> parameters)
        {
            if (string.IsNullOrEmpty(baseUrl))
                throw new ArgumentException(nameof(baseUrl));

            if (parameters == null || parameters.Count() == 0)
                return baseUrl;

            return parameters.Aggregate(baseUrl,
                (accumulated, kvp) => string.Format($"{accumulated}{kvp.Value}&"));

        }

        private static void PrintPDPResult(dynamic pdpSub)
        {
            Console.WriteLine($"PewDiePie currently have: {pdpSub} subscribers");//insert subs
        }


        private static void PrintStart()
        {
            Console.WriteLine("The war is on!");
            Thread.Sleep(500);
            Console.WriteLine("PewDiePie Vs Cocomelon – Nursery Rhymes");
            Thread.Sleep(500);
        }
    }
}

这是代码,我遵循了一个印度家伙在 YT 视频中所做的事情,所以有些事情我不知道该怎么做,但我知道发生了什么。

标签: c#api

解决方案


您的程序可能在进行任何 API 调用之前返回,因为您没有使用任何命令行参数执行它。删除此代码块,使其继续运行而不会提前返回。

var len = args?.Length;

if (len == null || len.Value == 0)
{
    PrintStart();
    return;
}

此外,pdpSubCount不应是函数参数,也不应传递给 DeserializeObject。您应该反序列化来自 api 调用的响应

return JsonConvert.DeserializeObject(pdpSub)

推荐阅读