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 |}} | ||