This shows you the differences between two versions of the page.
pjv:laboratoare:2024:a03 [2024/11/04 10:51] alexandru.gradinaru [Request-uri HTTP in Unity] |
pjv:laboratoare:2024:a03 [2024/11/04 12:42] (current) andrei.lapusteanu Updated note for back4app and parse |
||
---|---|---|---|
Line 87: | Line 87: | ||
Aceste sistem foloseste corutine intrucat cererile HTTP sunt in general asincrone - trebuie sa asteptam un raspuns, care poate dura si cateva secunde, fara a afecta/opri rularea aplicatiei Unity/a jocului. | Aceste sistem foloseste corutine intrucat cererile HTTP sunt in general asincrone - trebuie sa asteptam un raspuns, care poate dura si cateva secunde, fara a afecta/opri rularea aplicatiei Unity/a jocului. | ||
- | Mai jos gasiti un exemplu, preluat din pagina de documentatie oficiala [[https://docs.unity3d.com/2022.3/Documentation/ScriptReference/Networking.UnityWebRequest.Get.html]], care prezinta cum se trateaza un request simplu de preluare de informatii (GET). | + | Mai jos gasiti un exemplu, preluat din pagina de documentatie oficiala [[https://docs.unity3d.com/2022.3/Documentation/ScriptReference/Networking.UnityWebRequest.Get.html]], care prezinta cum se trateaza un request simplu de preluare de informatii (GET). |
<code c#> | <code c#> | ||
Line 377: | Line 377: | ||
In Unity totusi, puteti folosi mai simplu acest fel de sistem prin pachetul [[https://assetstore.unity.com/packages/tools/network/rest-client-for-unity-102501|REST Client for Unity]] care are deja integrata partea de promises si o parte de serializare JSON. | In Unity totusi, puteti folosi mai simplu acest fel de sistem prin pachetul [[https://assetstore.unity.com/packages/tools/network/rest-client-for-unity-102501|REST Client for Unity]] care are deja integrata partea de promises si o parte de serializare JSON. | ||
+ | |||
+ | Un exemplu de utilizare: | ||
+ | |||
+ | <code c#> | ||
+ | |||
+ | //exemplu de structura de date pentru parsare JSON | ||
+ | |||
+ | [Serializable] | ||
+ | public class UserData | ||
+ | { | ||
+ | public int id; | ||
+ | public string name; | ||
+ | public string email; | ||
+ | public UserAvatar avatar; | ||
+ | public UserProfile profile; | ||
+ | public UserQuest[] quests; | ||
+ | public UserTour[] tours; | ||
+ | public LibraryEvent[] libraryEvents; | ||
+ | } | ||
+ | |||
+ | |||
+ | //exemplu de functie care returneaza un Promise | ||
+ | public RSG.IPromise<UserData> GetUserProfile() { | ||
+ | |||
+ | return RestClient.Get<UserData>(Config.apiURL + "user") | ||
+ | .Then(result => { | ||
+ | |||
+ | //Debug.Log(JsonUtility.ToJson(result,true)); | ||
+ | |||
+ | data = result; | ||
+ | email = data.email; | ||
+ | name = data.name; | ||
+ | quests = data.quests; | ||
+ | id = Convert.ToUInt32(data.id); | ||
+ | |||
+ | return data; | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | |||
+ | //utilizare in cascada de evenimente | ||
+ | void Start () | ||
+ | { | ||
+ | |||
+ | User.instance.GetUserProfile() | ||
+ | .Then(result => { | ||
+ | Debug.Log("get library"); | ||
+ | return Library.instance.GetLibraryProfile(); | ||
+ | }) | ||
+ | .Then(result => { | ||
+ | Debug.Log("load scene"); | ||
+ | SceneManager.LoadScene(Config.libraryTitle); | ||
+ | // SceneManager.LoadScene(1); | ||
+ | // username.text = result.name; | ||
+ | }); | ||
+ | | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Gasiti mai multa documentatie aici [[https://github.com/proyecto26/RestClient]]. | ||
=== Gestionare autentificare === | === Gestionare autentificare === | ||
+ | |||
+ | Pentru a prelua din web informatii speficice pentru un anumit utilizator, cererile HTTP trebuie complementate cu informatia de autentificare prin folosirea unui header de Autorizare (Authorization). | ||
+ | |||
+ | In acest header transmitem in general un token. In functie de nevoi/capabilitati/dispozitive, exista mai multe tipuri de token-uri care pot fi folosite: | ||
+ | * Access tokens | ||
+ | * ID tokens | ||
+ | * Self-signed JWTs | ||
+ | * Refresh tokens | ||
+ | * Federated tokens | ||
+ | * Bearer tokens | ||
+ | |||
+ | Cel mai dese folosite sunt Bearer tokens, care, dupa cum descrie si numele, sunt o clasă generală de jeton care acordă acces părții în posesia tokenului. Token-urile de acces, ID tokens și JWT-urile sunt toate tokenuri Bearer. | ||
+ | |||
+ | Mai multe detalii despre tokenuri puteti citi aici: [[https://cloud.google.com/docs/authentication/token-types]]. | ||
+ | |||
+ | Pentru a folosi un token de tip Bearer, fiecare cerere HTTP trebuie sa conta un header de Autorizare de tip Bearer. De exemplu: | ||
+ | |||
+ | <code c#> | ||
+ | //Pentru RestClient package | ||
+ | |||
+ | //autorizare | ||
+ | RestClient.DefaultRequestHeaders["Authorization"] = "Bearer "+token.access_token; | ||
+ | //alte headere in functie de nevoie | ||
+ | RestClient.DefaultRequestHeaders["Accept"] = "application/json"; | ||
+ | |||
+ | //pentru UnityWebRequests | ||
+ | |||
+ | var uwr = new UnityWebRequest(url, "POST"); | ||
+ | //autorizare | ||
+ | uwr.SetRequestHeader("Authorization", "Bearer "+token.access_token); | ||
+ | //alte headere in functie de nevoie | ||
+ | uwr.SetRequestHeader("Content-Type", "application/json"); | ||
+ | </code> | ||
==== Game Launcher in C# ==== | ==== Game Launcher in C# ==== | ||
Line 431: | Line 524: | ||
=== HTTP === | === HTTP === | ||
- | Pentru partea de backend ne vom folosi de **Back4App**, ce este o platoforma de tip backend-as-a-service (BaaS), construita pe **Parse**, ce ofera stocare cloud, servicii de autentificare, baze de date, etc. | + | Pentru partea de backend in general este nevoie de un serviciu Web, cu o baza de date in spate. |
+ | Pentru exemplificare ne vom folosi de **Back4App**, ce este o platoforma de tip backend-as-a-service (BaaS), construita pe **Parse**, ce ofera stocare cloud, servicii de autentificare, baze de date, etc. | ||
In mod special pentru acest laborator ne vom folosi de apeluri catre endpoint-uri via un REST API (request-uri HTTP). | In mod special pentru acest laborator ne vom folosi de apeluri catre endpoint-uri via un REST API (request-uri HTTP). | ||
Line 494: | Line 588: | ||
Nu uitati sa schimbati ''YOUR_APP_ID'' si ''YOUR_REST_API_KEY''. Le gasiti in **dashboard-ul proiectului Back4App -> App Settings -> Security & Keys**. | Nu uitati sa schimbati ''YOUR_APP_ID'' si ''YOUR_REST_API_KEY''. Le gasiti in **dashboard-ul proiectului Back4App -> App Settings -> Security & Keys**. | ||
</note> | </note> | ||
+ | |||
+ | === Unity === | ||
+ | |||
+ | Dupa acesti pasi va trebui sa va folositi de celalalt buton din form (Start Game), prin care veti lansa in executie build-ul de Unity, caruia ii trimiteti argumentele necesare. Va trebui sa trimiteti si acel **session token** capturat anterior. | ||
+ | |||
+ | <note> | ||
+ | * In cazul in care ati folosit Back4App, aveti [[https://dashboard.back4app.com/apidocs#user-api|aici documentatia API-urilor]]. | ||
+ | * Back4App se bazeaza pe Parse, aveti [[https://docs.parseplatform.org/rest/guide/#users|aici documentatia API-urilor]] pentru acesta | ||
+ | </note> | ||
+ | |||
+ | |||
+ | Va trebui sa va alegeti un call care necesita acest session token, anume un call care are nevoie de campul din header ''X-Parse-Session-Token''. | ||
+ | |||
+ | Folositi ''UnityWebRequest'' pentru a face request-ul. In cerinte vi se specifica sa faceti un call pentru a returna numele utilizatorului (poate fi in exemplul nostru acest ''displayName''). | ||
+ | |||
+ | Un exemplu de API call ce se foloseste de acest session token este ilustrat mai jos. | ||
+ | |||
+ | {{ :pjv:laboratoare:2024:pajv_l3_back4app_api.png?700 |}} | ||