Получение данных из API в C# - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь получить данные из открытого API, используя C#.

В приведенном ниже коде мне удается создать объект HttpClient, но я не могу получить ответ http. У меня есть Console.Writeline(), чтобы помочь мне найти ошибку, и последнее, что я печатаю, это

Созданный HTTP-клиент

Так что я не получаю ответ. Кто-нибудь может сказать мне, что не так?

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

namespace CodeTesting
{
    public class Parser
    {
        public Parser()
        {
            Console.WriteLine("Created parser");
            GetQuestion();
        }

        public static async void GetQuestion()
        {
            Console.WriteLine("INSIDE GETQUESTION");
            string baseUrl = "https://opentdb.com/api.php?amount=10&category=15&difficulty=easy";

            try
            {
                using (HttpClient client = new HttpClient())
                {
                    Console.WriteLine("Created HTTPClient");

                    using (HttpResponseMessage res = await client.GetAsync(baseUrl))
                    {
                        Console.WriteLine("GOT HTTP RESPONSE");

                        using (HttpContent content = res.Content)
                        {
                            Console.WriteLine("RETRIEVING CONTENT");
                            var data = await content.ReadAsStringAsync();
                            if (data != null)
                            {
                                Console.WriteLine("data------------{0}", data);
                            }
                            else
                            {
                                Console.WriteLine("NO Data----------");
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine("Exception Hit------------");
                Console.WriteLine(exception);
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Просто подождите, пока http-клиент получит значения. Таким образом, ваш парсер будет выглядеть примерно так:

public Parser()
        {
            Console.WriteLine("Created parser");
            GetQuestion();
            Console.ReadLine();
        }

Примечание: это не решение, но чтобы разблокировать вас, попробуйте это, чтобы вы могли просмотреть вывод.

Вывод:

Создан синтаксический анализатор
ВНУТРИ ПОЛУЧЕНИЯ
Создан HTTPClient
ПОЛУЧЕН HTTP ОТВЕТ
ПОЛУЧЕНИЕ КОНТЕНТА
данные ------------ {"response_code" : 0, "results": [{"category": "Развлечения: Видеоигры", "type": "multiple", "затруднение": "easy", "question": "Как называлось отмененное продолжение Team Fortress? "," Correct_answer ":" Team Fortress 2: Братство Оружия "," invalid_answers ": [" Team Fortress 2: Наемники пустыни "," Team Fortress 2: Operation Gear Grinder "," Team Fortress 2: Вернуться к Classi c "]}, {" category ":" Развлечения: Видеоигры "," type ":" boolean "," затруднение ":" easy "," question ":" В "Super Mario 64", сбор 100 монеты на уровне дадут вам 1-UP. "," correct_answer ":" False "," invalid_answers ": [" True "]}, {" category ":" Развлечения: Видеоигры "," type ":" логическое значение "" Diff iculty ":" easy "," question ":" Нико Белли c - главный герой Grand Theft Auto IV. "," correct_answer ":" True "," invalid_answers ": [" False "]}, {" category ":" Развлечения: Видеоигры "," тип ":" несколько "," сложность ":" легко "," вопрос ":" В каком году игра "Overwatch" вступила в закрытую бета-версию? "," Correct_answer ":" 2015 "," invalid_answers ": [" 2013 "," 2011 "," 2016 "]}, {" category ":" Развлечения: Видеоигры "," type ":" multiple "," затруднение ":" easy "," question ":" Сколько есть фигурок Tetris различной формы? "," correct_answer ":" 7 "," invalid_answers ": [" 5 "," 6 "," 8 "]}, {" category ":" Развлечения: Видеоигры "," тип ":" несколько "," сложность ":" легко "," вопрос ":" Какая видеоигра вызвала спор из-за скрытой мини-игры "Горячий кофе"? "," Correct_answer ":" Grand Theft Auto : San Andreas "," invalid_answers ": [" Grand Theft Auto: Vice City "," Hitman: Blood Money "," Cooking Mama "]}, {" category ":" Развлечения: Видеоигры "," type ":" Multiple "," затруднение ":" легко "," вопрос ":" Название серии Metroid приходит от om what? "," correct_answer ":" Враг в игре "," invalid_answers ": [" Имя финального босса "," Имя главного героя "," Имя космического корабля "]}, {" category ":" Развлечения: видеоигры "," тип ":" несколько "," сложность ":" легко "," вопрос ":" Что из перечисленного НЕ было игровым персонажем в игре Kingdom Hearts: Birth by Sleep? "," Correct_answer ":" Ignis "," invalid_answers ": [" Ventus "," Terra "," Aqua "]}, {" category ":" Развлечения: Видеоигры "," тип ":" несколько "," трудность ":" easy "," question ":" Кто оказывается истинным победителем в битве при Армагеддоне в Мортал Комбат? "," correct_answer ":" Шао Кан "," invalid_answers ": [" Лю Кан "," Шан Цунг " , "Raiden"]}, {"category": "Развлечения: Видеоигры", "type": "множественный", "затруднение": "легкий", "question": "В" Mario & Soni c на Olympi c Игры ", символы делятся на сколько типов?", "Correct_answer": "4", "invalid_answers": ["6", "5", "3"]}]}

0 голосов
/ 03 марта 2020

Просто удалите await из HttpResponseMessage и добавьте «.Result» в конце функции GetAsyn c (), код ниже работает.

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

namespace CodeTesting
{
    public class Parser
    {
        public Parser()
        {
            Console.WriteLine("Created parser");
            GetQuestion();
        }
        public static async void GetQuestion()
        {
            Console.WriteLine("INSIDE GETQUESTION");
            string baseUrl = "https://opentdb.com/api.php?amount=10&category=15&difficulty=easy";

            try
            {

                using (HttpClient client = new HttpClient())
                {
                    Console.WriteLine("Created HTTPClient");

                    using (HttpResponseMessage res = client.GetAsync(baseUrl).Result)
                    {
                        Console.WriteLine("GOT HTTP RESPONSE");

                        using (HttpContent content = res.Content)
                        {
                            Console.WriteLine("RETRIEVING CONTENT");

                            var data = await content.ReadAsStringAsync();

                            if (data != null)
                            { Console.WriteLine("data------------{0}", data);}
                            else
                            { Console.WriteLine("NO Data----------"); }
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine("Exception Hit------------");
                Console.WriteLine(exception);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...