Использование RESTful API с Xamarin.forms - PullRequest
2 голосов
/ 19 марта 2019

Впервые на Xamarin.forms.

Следующий код должен генерировать список игр и привязывать его к представлению списка, но это не так. Я использую библиотеку Refit. URL в Postman возвращает список JSON, как и предполагалось. С чего мне начать?

ISteamService.CS

using System.Collections.Generic;
using System.Threading.Tasks;
using Refit;

namespace PatchNotes
{

[Headers("Content-Type: application/json")]
public interface ISteamService
{
    [Get("/IPlayerService/GetOwnedGames/v1/?key=XXXXC&include_appinfo=1&steamid=XXXX")]
    Task<string> GetGames();
}

}

MainPage.xaml.cs

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Xamarin.Forms;
using Refit;

namespace PatchNotes
{
    public partial class MainPage : ContentPage
    {
    public MainPage()
    {
        InitializeComponent();
    }

    async void OnGetGamesClicked(object sender, System.EventArgs e)
    {
        var apiResponse = RestService.For<ISteamService>("https://api.steampowered.com");
        var games = await apiResponse.GetGames();

        GamesList.ItemsSource = games;

    }
}
}

MainPage.xaml

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
         x:Class="PatchNotes.MainPage">
<ContentPage.Content>
    <StackLayout Padding="40">
         <Button Text="Get Games" Clicked="OnGetGamesClicked" 
BackgroundColor="Black" TextColor="White" 
HorizontalOptions="FillAndExpand"/>

          <ListView x:Name="GamesList">
            <ListView.ItemTemplate>
              <DataTemplate>
                <TextCell Text="{Binding Name}" />
              </DataTemplate>
            </ListView.ItemTemplate>
           </ListView>
    </StackLayout>
</ContentPage.Content>

1 Ответ

1 голос
/ 19 марта 2019

Согласно этой документации GetOwnedGames вернет JSON (как правильно предположил Джейсон) со следующей структурой

{
    "game_count": <number of games>,
    "games": [ 
        {
            "appid": "...",
            "name": "...",
            "playtime_2weeks": ,
            "playtime_forever": ,
            "img_icon_url": "",
            "img_logo_url": "",
            "has_community_visible_stats": "" 
        }, ...]
}

Вы не можете просто присвоить эту строку ItemsSource и ожидать, что Xamarin.Forms выяснит для вас, вам придется позаботиться о том, как это десериализовано.

Вам нужно написать класс, который используется для десериализации вашей строки JSON. Refit выполнит десериализацию, но вам нужен класс для десериализации в любом случае:

public class GamesList
{
    [JsonProperty("game_count")]
    public int GameCount { get; set; }

    [JsonProperty("games")]
    public List<Game> Games { get; set; }
}

public class Game
{
    [JsonProperty("appid")]
    public string AppId { get; set; }

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

    [JsonProperty("playtime_2weeks")]
    public int PlayedMinutesInTheLastTwoWeeks { get; set; }

    // And so on. Depending on what you need.
}

(См. Документацию JSON.Net в JsonProperty)

Теперь вы можете переопределить ваш ISteamService

[Headers("Content-Type: application/json")]
public interface ISteamService
{
    [Get("/IPlayerService/GetOwnedGames/v1/?key=XXXXC&include_appinfo=1&steamid=XXXX")]
    Task<GamesList> GetGames();
}

и используйте его из вашего OnGetGamesCicked как

var apiResponse = RestService.For<ISteamService>("https://api.steampowered.com");
var gamesList = await apiResponse.GetGames();

GamesList.ItemsSource = gamesList.Games;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...