#c# #json #api #xamarin.forms
Вопрос:
Я создаю проект, который использует ключ доступа API для получения информации о складских данных. Пользователь вводит символ акции и нажимает кнопку, которая затем загружает всю информацию о запасах. Однако, когда вы вводите правильный биржевой символ и нажимаете кнопку для загрузки информации, он постоянно выдает мое исключение catch, которое я настроил, и я не знаю, почему. Я никогда раньше не использовал try catch, так что я делаю что-то не так?
Вот мой метод в моей SettingsTab.cs
попытке получить информацию о запасах:
async void AddStockButton_Clicked(object sender, EventArgs e)
{
string symbol = symbolEntry.Text.ToLower();
//Create a try catch block to make sure the symbol exists and isn't already added in the list
try
{
//Create new data manager and pass in the users chosen symbol
DataManager dataManager = new DataManager(symbol);
StockData newStockData = await dataManager.GetStock();
if (stockList.Contains(newStockData))
{
//If stock does not exists or is a duplicate, display error alert
//Change success label text to Unsuccessful, change color to red, amp; make visible
await DisplayAlert("DUPLICATE STOCK", "This stock is already added to your favorites!", "OKAY");
successLabel.Text = "Unsuccessful due to duplicate";
successLabel.TextColor = Color.Red;
successLabel.IsVisible = true;
}
else if (!stockList.Contains(newStockData))
{
//If stock exists and not duplicate, add that stock to a list of stockData
//Display success alert
//Make success label visible
stockList.Add(newStockData);
await DisplayAlert("STOCK ADDED", "This stock has been successfully added to your favorites!", "OKAY");
successLabel.IsVisible = true;
MessagingCenter.Send<StockData>(newStockData, "NewStockData");
}
}
catch (WebException ex)
{
await DisplayAlert("API FAILED","Unable to retrieve data for that symbol. Please check that you typed it correctly or try again later.", "GO BACK");
successLabel.Text = "Unsuccessful due to API error";
successLabel.TextColor = Color.Red;
successLabel.IsVisible = true;
}
}
а вот мой DataManager.cs
класс, который получает API и преобразует его в json:
public class DataManager
{
//This class will be responsible for pulling data from remote API
//And putting it into the stock data opjects and passing it back to normal UI classes
//Create variables to use
WebClient apiConnection = new WebClient();
//Create a string to start API
string startAPI = "http://api.marketstack.com/v1/eod/latest?accesskey=<<ACCESS KEY REDACTED>>";
string Symbols { get; set; }
string ApiEndPoint
{
get
{
return startAPI Symbols;
}
}
public DataManager(string symbolsToDownload)
{
//make symbols equal to whatever gets passed in
Symbols = symbolsToDownload;
}
public async Task<StockData> GetStock()
{
//Create a string representation of the downloaded data from ApiEndPoint
string apiString = await apiConnection.DownloadStringTaskAsync(ApiEndPoint);
//Create a JObject to store the apiString as a parsed JObject to get access
//to the json formatted data
JObject jsonData = JObject.Parse(apiString);
//create another JObject
JObject firstStock = (JObject)jsonData["data"][0];
Debug.WriteLine(firstStock.ToString());
//Create a new StockData object
StockData stockData = new StockData();
stockData.StockName = firstStock["symbol"].ToString();
//We need to get the string value and parse it as a Double to define the stock Data property
stockData.OpenPrice = Double.Parse(firstStock["open"].ToString());
stockData.ClosePrice = Double.Parse(firstStock["close"].ToString());
stockData.HighPrice = Double.Parse(firstStock["high"].ToString());
stockData.LowPrice = Double.Parse(firstStock["low"].ToString());
stockData.Volume = Double.Parse(firstStock["adj_volume"].ToString());
stockData.Exchange = firstStock["exchange"].ToString();
stockData.TradingDay = DateTime.Parse(firstStock["open"].ToString());
//return the new stock data object
return stockData;
}
}
Я просто неправильно использую свою уловку try? Все, что я нахожу в Интернете, сбивает меня с толку.. Я все еще студент и учусь, поэтому прошу прощения, если это глупый вопрос. Пожалуйста, помогите мне
Комментарии:
1. Когда вы говорите «постоянно», вы имеете в виду «постоянно»? Это означает, что он выбрасывается без выполнения вашего кода. Постоянно означает, что он выбрасывается при каждом запуске вашего кода.
2. Вы получаете исключение. Но в чем его Смысл? Также проверьте исключение InnerException. «Что-то» не так, и исключение говорит вам, что
3. Что такое
ex.ToString()
?4. Вам не следовало размещать свой ключ доступа на SO. Убедитесь, что вы получили новый.
5. Наличие исключения только для того, чтобы сообщить своим пользователям, что что-то пошло не так, без регистрации полученной информации, довольно бесполезно. Объект исключения, переданный обработчику, полон информации о том, где и почему вы получили ошибку. Просто на данный момент поместите точку останова в обработчик исключений и скажите нам, каково значение ex.Message
Ответ №1:
если вы вставите свой URL-адрес в свой браузер
string startAPI = "http://api.marketstack.com/v1/eod/latest?accesskey=<<ACCESS KEY REDACTED>>amp;symbol=AAPL";
вы получите обратно это очень дружелюбное и явное сообщение об ошибке
{
"error":
{
"code": "missing_access_key",
"message": "You have not supplied an API Access Key. [Required format: access_key=YOUR_ACCESS_KEY]"
}
}
accesskey
должно быть access_key
Комментарии:
1. Ключ доступа был изменен. Это не часть проблемы.
2. OP использует неправильное имя для
access_key
параметра
Ответ №2:
- Убедитесь, что значение access_key передано правильно и значение правильное.
- Добавьте точку останова в первую строку попытки, чтобы увидеть, где произошла ошибка.
- Распечатайте «ex» в catch, чтобы просмотреть конкретную информацию об ошибке.