Я делаю небольшую консольную программу с 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";
}
}
}
Наблюдаемый результат заключается в том, что каждый раз, когда я пишу ключевое слово и страну, я получаю другой результат - список стран, имен и доменов в соответствии с моим запросом (url). Теперь я получаю тот же результат, даже если пытаюсь написать ключевое слово и страну во второй раз.
Вы пропустили часть об использовании отладчика и определении конкретных строк кода и конкретных значений переменных. Это действительно важная часть.
Я получаю большинство проблем в общедоступной статической строке Url = "Universitys.hipolabs.com/search?name=" + userInputKeyWord + "&country = " + userInputCountry + ""; Если я не использую static, я получаю сообщение об ошибке в другом месте return requestHandler.GetResult(RequestConstants.Url);
Что ж, код, показанный в этой строке, даже не должен компилироваться. Эти переменные не определены в этой области. Что касается ваших проблем, каковы «большинство проблем» в этом случае? Каково полученное значение Url? Каким, по-вашему, должно быть это значение? Почему?
Я ожидаю, что каждый раз, когда я пишу ключевое слово и страну, я получаю разные значения URL.
Где вы обновляете статическую переменную Url? Если вы никогда не обновите эту переменную, она будет по-прежнему иметь значение, которое вы ей присвоили в первый раз. Ваша отладка будет учитывать этот факт, и вы не указали иное. Итак, еще раз... Где конкретно вы видите проблему при отладке?
Если я удалю static из общедоступной статической строки Url = "Universitys.hipolabs.com/search?name=" + userInputKeyWord + "&country = " + userInputCountry + ""; то я получаю сообщение об ошибке в RequestConstants.Url. общедоступная статическая строка GetResult (IRequestHandler requestHandler) { return requestHandler.GetResult (RequestConstants.Url); }
Где в методе Input.Dot() вы обновляете статическую переменную Url? Подсказка: вы этого не сделаете. Вы использовать эту переменную в своем методе GetResult, но никогда не Обновить ее значение. Таким образом, он будет по-прежнему иметь ту же ценность, которую вы изначально присвоили ему. Я думаю, если вы хотите обновить переменную, вам следует обновить переменную. Хотя я полагаю, вы правы, говоря, что все, что вы делаете, «не лучший способ». Кажется, что этот код просто засоряет ключевое слово static в случайных местах, что вызовет много путаницы, если вы не понимаете, что это значит.
Хотя это также восходит к концепции отладки... Если вы ожидаете, что переменная Url изменится, где в вашей отладке вы ожидаете, что это произойдет? Где вы наблюдаете, как это происходит или не происходит? Вы явно не отлаживает, и именно это вам и следует делать. Наблюдать всегда предпочтительнее, чем гадать. Используйте отладчик и наблюдать именно то, что делает ваш код. Также есть отличная статья о некоторых основных методах отладки, которые вы можете попробовать: ericlippert.com/2014/03/05/как-отлаживать-маленькие-программы
Мои ошибки. Если я удалю статическую строку из общедоступной статической строки Url = "Universitys.hipolabs.com/search?name=" + userInputKeyWord + "&country = " + userInputCountry + ""; то я получаю сообщение об ошибке в RequestConstants.Url. общедоступная статическая строка GetResult (IRequestHandler requestHandler) { return requestHandler.GetResult (RequestConstants.Url); } если я удаляю статические данные из этой строки, я получаю сообщение об ошибке в var response = GetResult(restSharpRequestHandler);
Вы снова просто случайным образом добавляете/удаляете ключевое слово static в своей программе, как будто это своего рода декоративный гарнир, и игнорируете сообщения об ошибках, которые вы получаете в результате. Это неэффективная стратегия. Спросите себя, должен это значение будет static? Почему так должно быть? Или почему не должно быть? Сделайте его каким бы он ни был, должен, а затем конкретно устраните все возникающие ошибки. (Подсказка: если вы не знаю, что означает static, тогда это наверное твой баг. Случайное написание кода, не зная, что он должен делать будет, приведет к ошибкам.)





Изменить строку
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);
Я немного обновил свой пост. Надеюсь, это поможет вам улучшить ваш код.
Я видел это, спасибо.
Вы хотите, чтобы мы отладили для вас много кода. Это прекрасное время для ты, чтобы начать знакомиться с отладкой. Используя отладчик, вы можете поместить точку останова в любую строку кода, чтобы приостановить выполнение этой строки во время выполнения. Затем вы можете шаг за шагом выполнять код по мере его выполнения и наблюдать за точным поведением во время выполнения и изменением значений ваших переменных. Когда вы делаете это, в какой конкретной строке вы впервые наблюдаете неожиданный результат? Какие ценности были в то время? Каков был наблюдаемый результат? Какой результат вы ожидали? Почему?