Проблема ввода формы консоли С#

Я делаю небольшую консольную программу с API (https://github.com/Hipo/university-domains-list-api), и у меня есть проблема - когда я пишу информацию в переменные inputkeyword и inputcountry в первый раз, она работает нормально, но во второй раз и т. д. я получаю тот же ответ, что и У меня получилось с первой попытки. Спасибо за помощь.

    public interface IRequestHandler
    {
        //Method to get the data of the repo provided by the url
        string GetResult(string url);
    }
    // using request handler to get an url address
    public static string GetResult(IRequestHandler requestHandler)
    {
        return requestHandler.GetResult(RequestConstants.Url);
    }

    public class RestSharpRequestHandler : IRequestHandler
    {
        public string GetResult(string url)
        {
            var client = new RestClient(url);
            var response = client.Execute(new RestRequest());
            return response.Content;
        }
    }

    public class Input
    {
        public static string userInputKeyWord;
        public static string userInputCountry;
        public static void dot()
        {
            Console.WriteLine("Insert keyword which you need to find your university");
            userInputKeyWord = Console.ReadLine();
            Console.WriteLine("You entered keyword {0}", userInputKeyWord);
            Console.WriteLine();


            Console.WriteLine("Insert country which you need");
            userInputCountry = Console.ReadLine();
            Console.WriteLine("You entered country {0}", userInputCountry);
            Console.WriteLine();

            Console.WriteLine("Creating the list of schools according to your request.");
            Console.WriteLine();
            IRequestHandler restSharpRequestHandler = new RestSharpRequestHandler();
            var response = GetResult(restSharpRequestHandler);
            var Results = JsonConvert.DeserializeObject<List<School>>(response);
            if (Results.Count() == 0)
            {
                Console.WriteLine("Nothing found.");
            }
            else
            {
                foreach (var release in Results)
                {
                    Console.WriteLine("Country: {0}", release.Country);
                    Console.WriteLine("Name: {0}", release.Name);
                    Console.WriteLine("Domains: {0}", release.Domains);
                    Console.WriteLine();

                }
            }
        }
    }

    // JSON properties
    public class School
    {
        [JsonProperty("web_pages")]
        public Uri[] WebPages { get; set; }

        [JsonProperty("alpha_two_code")]
        public string AlphaTwoCode { get; set; }

        [JsonProperty("state-province")]
        public object StateProvince { get; set; }

        [JsonProperty("country")]
        public string Country { get; set; }

        [JsonProperty("domains")]
        public string[] Domains { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }
    }

    //url for getting information from json
    public class RequestConstants : Input
    {

        //public static string userInputKeyWord;
        //public static string userInputCountry;
        public string BaseUrl = "http://universities.hipolabs.com/";
        public static string Url = "http://universities.hipolabs.com/search?name = " + userInputKeyWord + "&country = " + userInputCountry + "";
        public string UserAgent = "User-Agent";
        public string UserAgentValue = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
    }

}

}

Вы хотите, чтобы мы отладили для вас много кода. Это прекрасное время для ты, чтобы начать знакомиться с отладкой. Используя отладчик, вы можете поместить точку останова в любую строку кода, чтобы приостановить выполнение этой строки во время выполнения. Затем вы можете шаг за шагом выполнять код по мере его выполнения и наблюдать за точным поведением во время выполнения и изменением значений ваших переменных. Когда вы делаете это, в какой конкретной строке вы впервые наблюдаете неожиданный результат? Какие ценности были в то время? Каков был наблюдаемый результат? Какой результат вы ожидали? Почему?

David 21.01.2019 14:16

Наблюдаемый результат заключается в том, что каждый раз, когда я пишу ключевое слово и страну, я получаю другой результат - список стран, имен и доменов в соответствии с моим запросом (url). Теперь я получаю тот же результат, даже если пытаюсь написать ключевое слово и страну во второй раз.

yagoo 21.01.2019 14:27

Вы пропустили часть об использовании отладчика и определении конкретных строк кода и конкретных значений переменных. Это действительно важная часть.

David 21.01.2019 14:29

Я получаю большинство проблем в общедоступной статической строке Url = "Universitys.hipolabs.com/search?name=" + userInputKeyWord + "&country = " + userInputCountry + ""; Если я не использую static, я получаю сообщение об ошибке в другом месте return requestHandler.GetResult(RequestConstants.Url);

yagoo 21.01.2019 14:36

Что ж, код, показанный в этой строке, даже не должен компилироваться. Эти переменные не определены в этой области. Что касается ваших проблем, каковы «большинство проблем» в этом случае? Каково полученное значение Url? Каким, по-вашему, должно быть это значение? Почему?

David 21.01.2019 14:40

Я ожидаю, что каждый раз, когда я пишу ключевое слово и страну, я получаю разные значения URL.

yagoo 21.01.2019 14:42

Где вы обновляете статическую переменную Url? Если вы никогда не обновите эту переменную, она будет по-прежнему иметь значение, которое вы ей присвоили в первый раз. Ваша отладка будет учитывать этот факт, и вы не указали иное. Итак, еще раз... Где конкретно вы видите проблему при отладке?

David 21.01.2019 14:43

Если я удалю static из общедоступной статической строки Url = "Universitys.hipolabs.com/search?name=" + userInputKeyWord + "&country = " + userInputCountry + ""; то я получаю сообщение об ошибке в RequestConstants.Url. общедоступная статическая строка GetResult (IRequestHandler requestHandler) { return requestHandler.GetResult (RequestConstants.Url); }

yagoo 21.01.2019 14:48

Где в методе Input.Dot() вы обновляете статическую переменную Url? Подсказка: вы этого не сделаете. Вы использовать эту переменную в своем методе GetResult, но никогда не Обновить ее значение. Таким образом, он будет по-прежнему иметь ту же ценность, которую вы изначально присвоили ему. Я думаю, если вы хотите обновить переменную, вам следует обновить переменную. Хотя я полагаю, вы правы, говоря, что все, что вы делаете, «не лучший способ». Кажется, что этот код просто засоряет ключевое слово static в случайных местах, что вызовет много путаницы, если вы не понимаете, что это значит.

David 21.01.2019 14:51

Хотя это также восходит к концепции отладки... Если вы ожидаете, что переменная Url изменится, где в вашей отладке вы ожидаете, что это произойдет? Где вы наблюдаете, как это происходит или не происходит? Вы явно не отлаживает, и именно это вам и следует делать. Наблюдать всегда предпочтительнее, чем гадать. Используйте отладчик и наблюдать именно то, что делает ваш код. Также есть отличная статья о некоторых основных методах отладки, которые вы можете попробовать: ericlippert.com/2014/03/05/как-отлаживать-маленькие-программы

David 21.01.2019 14:55

Мои ошибки. Если я удалю статическую строку из общедоступной статической строки Url = "Universitys.hipolabs.com/search?name=" + userInputKeyWord + "&country = " + userInputCountry + ""; то я получаю сообщение об ошибке в RequestConstants.Url. общедоступная статическая строка GetResult (IRequestHandler requestHandler) { return requestHandler.GetResult (RequestConstants.Url); } если я удаляю статические данные из этой строки, я получаю сообщение об ошибке в var response = GetResult(restSharpRequestHandler);

yagoo 21.01.2019 14:59

Вы снова просто случайным образом добавляете/удаляете ключевое слово static в своей программе, как будто это своего рода декоративный гарнир, и игнорируете сообщения об ошибках, которые вы получаете в результате. Это неэффективная стратегия. Спросите себя, должен это значение будет static? Почему так должно быть? Или почему не должно быть? Сделайте его каким бы он ни был, должен, а затем конкретно устраните все возникающие ошибки. (Подсказка: если вы не знаю, что означает static, тогда это наверное твой баг. Случайное написание кода, не зная, что он должен делать будет, приведет к ошибкам.)

David 21.01.2019 15:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
12
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Изменить строку

public static string Url = "http://universities.hipolabs.com/search?name = " + userInputKeyWord + "&country = " + userInputCountry + "";

к

public static string Url => "http://universities.hipolabs.com/search?name = " + userInputKeyWord + "&country = " + userInputCountry + "";

(уведомление "=" было изменено на стрелку "=>")

Это должно работать, потому что вы объявили поле URL, которое устанавливается только один раз. И я предлагаю вам превратить его в свойство, которое вычисляется каждый раз, чтобы оно учитывало изменения в этих статических полях. Это эффективно похоже на объявление метода

public static string GetUrl() {
    return "http://universities.hipolabs.com/search?name = " + userInputKeyWord + "&country = " + userInputCountry + "";
}

Также лучше использовать RestSharp API для добавления параметров в запрос. Я бы обновил ваш код следующим образом

public interface IRequestHandler
{
    //Method to get the data of the repo provided by the url
    string GetResult(string keyword, string country);
}
// using request handler to get an url address
public static string GetResult(IRequestHandler requestHandler, string keyword, string country)
{
    return requestHandler.GetResult(keyword, country);
}

public class RestSharpRequestHandler : IRequestHandler
{
    const string url = "http://universities.hipolabs.com/search";

    public string GetResult(string keyword, string country)
    {
        //"http://universities.hipolabs.com/search?name = " + userInputKeyWord + "&country = " + userInputCountry + "";
        //the values given in the url are GET params, so we add it using RestSharp API
        //also it's unsafe to manually concatenate parameters in url because some values should be encoded according to HTTP specification. Let RestSharp does it for you
        var client = new RestClient(url);
        var request = new RestRequest(Method.GET);
        request.AddParameter("name", keyword);
        request.AddParameter("country", country);
        var response = client.Execute(request);
        return response.Content;
    }
}

И линия

var response = GetResult(restSharpRequestHandler);

превратится в

var response = GetResult(restSharpRequestHandler, userInputKeyWord, userInputCountry);

Я немного обновил свой пост. Надеюсь, это поможет вам улучшить ваш код.

Alexander 21.01.2019 15:12

Я видел это, спасибо.

yagoo 21.01.2019 15:13

Другие вопросы по теме