<aside> 💡

Zorg er voor dat voor je gaat beginnen met bouwen je API draait op http://localhost:5050

</aside>

Wat er gebeurt
1 De cursist rondt een oefening af
2 Unity stuurt het resultaat op met POST /resultaten
3 Unity haalt de lijst opnieuw op met GET /resultaten
4 De ranglijst verschijnt in beeld

Stap 2 en 3 horen bij elkaar. Je stuurt pas iets op en vraagt het daarna terug, zodat je zeker weet dat wat je toont ook echt in de database staat.


Unity gebruikt geen HttpClient

In een gewone C#-app pak je HttpClient. In Unity niet. Unity heeft zijn eigen UnityWebRequest, die meeloopt met het frame-ritme van de engine en op alle platforms werkt. Je roept hem aan vanuit een coroutine.


Stap 1: de vorm van je gegevens

JsonUtility is de JSON-lezer van Unity. Die heeft klassen nodig die precies op je JSON lijken. Ze staan onderaan ApiClient.cs, net zoals de records onderaan je Program.cs staan.

[Serializable]
public class Result
{
    public string cursist;
    public string oefening;
    public float seconden;
    public int fouten;
    public int id;
}

[Serializable]
public class ResultList
{
    public List<Result> resultaten;
}

<aside> 💡

Die ResultList eromheen is geen willekeur. JsonUtility kan geen JSON lezen die begint met [. Daarom zit je lijst in een object, en daarom staat er { "resultaten": [...] } in je API.


Stap 2: de ApiClient, je ene deur

Alle verzoeken lopen via één api client class

public class ApiClient : MonoBehaviour
{
    [SerializeField] private string baseUrl = "<http://localhost:5050>";

    public IEnumerator GetResults(Action<ResultList> onSuccess, Action<string> onError)
    {
        using UnityWebRequest request = UnityWebRequest.Get(baseUrl + "/resultaten");
        yield return request.SendWebRequest();

        if (request.result != UnityWebRequest.Result.Success)
        {
            onError?.Invoke($"{request.responseCode}: {request.error}");
            yield break;
        }

        ResultList list = JsonUtility.FromJson<ResultList>(request.downloadHandler.text);

        onSuccess?.Invoke(list);
    }
}

yield return request.SendWebRequest() is de regel die wacht. Je game loopt gewoon door, en zodra het antwoord binnen is gaat de methode verder op de volgende regel.

Die twee Actionparameters

Dat is de Observer van vorige week, in het klein. ApiClient weet niet wat er met het resultaat moet gebeuren. Hij roept gewoon terug: gelukt met deze lijst, of mislukt met deze melding. Wie dat opvangt mag zelf weten wat hij ermee doet.