簡體   English   中英

Xamarin.Forms 消費 API

[英]Xamarin.Forms Consume API

有人能幫我嗎?

我正在嘗試在我的應用程序中使用 api(我還在學習)。 我可以成功調用 api 並獲取數據,但調試以 DeserializeObject 結束。

有人可以幫助我,並告訴我該怎么做嗎? 或參考如何解決這個問題?

這是我的代碼:

我的視圖模型

從 ViewModels 我調用GetHeroes() ,它在服務中調用我的 class 。

    public class DotaViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public DotaViewModel()
    {
        GetHeroes(); // Start From Here
    }

    IDotaApi _rest = DependencyService.Get<IDotaApi>();

    private ObservableCollection<Hero> heroes;

    public ObservableCollection<Hero> Heroes
    {
        get { return heroes; }
        set
        {
            heroes = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Heroes"));
        }
    }

    public async void GetHeroes()
    {
        var result = await _rest.getheroes(); // Go Inside Here

        if (result != null)
        {

        }
    }
}

我的服務

我得到了數據並將其存儲到var result ,但我的調試只是在我DeserializeObject時進行。

public class DotaApi : IDotaApi
{
    string Base_url = "https://api.opendota.com/api/heroes";
    public async Task<ObservableCollection<Hero>> getheroes()
    {

        string url = Base_url;

        HttpClient client = new HttpClient();
        HttpResponseMessage responseMessage = await client.GetAsync(url);

        if (responseMessage.StatusCode == System.Net.HttpStatusCode.OK)
        {
            var result = await responseMessage.Content.ReadAsStringAsync(); // I Got Data Here

            var json = JsonConvert.DeserializeObject<ObservableCollection<Hero>>(result); // But Stuck Here

            return json;
        }

        return null;
    }
}

這是我的 Model

public class Hero
{
    public int id { get; set; }
    public string name { get; set; }
    public string localized_name { get; set; }
    public string primary_attr { get; set; }
    public string attack_type { get; set; }
    public List<string> roles { get; set; }
    public int legs { get; set; }

    //[
      //{"id":1,
       //"name":"npc_dota_hero_antimage",
       //"localized_name":"Anti-Mage",
       //"primary_attr":"agi",
       //"attack_type":"Melee",
       //"roles":["Carry","Escape","Nuker"],
       //"legs":2}
      //}
   //]


}

嘗試執行 API 調用方法,如下所示,並在異常中添加調試點並檢查問題

public async Task<ObservableCollection<Hero>> getheroes()
{
    string Base_url = "https://api.opendota.com/api/heroes";

    using (var httpClient = new HttpClient())
    {
        var data = new ObservableCollection<Hero>();
        try
        {
            var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
            var result = await httpClient.GetAsync(Base_url);
            var response = await result.Content.ReadAsStringAsync();
            data = JsonConvert.DeserializeObject<ObservableCollection<Hero>>(response);

            if (result.IsSuccessStatusCode && result.StatusCode == HttpStatusCode.OK)
            {
                return data;
            }

            return null;
        }
        catch (Exception exp)
        {
            return null;
        }
    }
}

謝謝大家,

我終於解決了問題

這純粹是我的錯,因為我之前並沒有真正理解它是如何工作的,所以我嘗試更深入地了解 ObservableCollection 以及如何調試

現在我知道,DeserializeObject 沒有任何問題,就像我在我的問題中所說的那樣(抱歉),問題出在 GetHeroes() function

public async void GetHeroes()
    {
        var result = await _rest.getheroes();

        if (result != null)
        {
            Heroes = result; // i missed this code, so. I haven't entered my data before
        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM