Oncioiu Miruna Elena - 322CC
Tema 3 - Client web. Comunicatie cu REST API.
Tema presupune implementarea unei aplicatii client-server care sa permita administrarea unei biblioteci de filme printr-un REST API. Clientul, realizat
in limbaj C, va comunica cu serverul prin intermediul protocoalelor HTTP/1.1, gestionand atat autentificarea (prin cookie-uri si token JWT), cat si toate operatiunile de: creare, citire, actualizare, stergere pt utilizatori, filme si colectii. Am folosit libraria JSON Parson, deoarece era recomandata pt limbajul C, si am mai lucrat cu aceasta pe parcursul facultatii. Scheletul l-am preluat din laborator, modificand doar fisierele: request.c/request.h, respectiv client.c/client.h. In fisierul request.h am construit manual cererile HTTP (GET, POST, PUT, DELETE), conform scheletului de laborator. In client.c, in main citesc comenzile de la stdin, gestionez cookie-urile pentru admin si utilizator, am creat 2 deoarece mi s-a parut mai intuitiv, pt a vedea care este activ la orice moment. Pe rand, verific fiecare comanda si o gestionez intr-o functie destinata ei.
Functii:
-> auth_header, insereaza linia Authorization: Bearer token, imediat dupa antet si inaintea corpului;
-> extract_cookie, extrage valoarea cookie-ului din header;
-> json_build_login, construieste un obiect json pt autentificare, cu username, password, dar si admin_username, daca exista, folosit in admin_login,
add_user si user_login; -> json_build_movie, construieste un obiect json cu detaliile unui film, folosit in do_add_movie si in do_update_movie. -> user_and_pass, citeste de la stdin username si password, dar si admin_username daca exista, folosit in admin_login, add_user si user_login;
Functii de autentificare si gestionare sesiuni:
-> se ocupa cu intregul flux de login-logout, pt doua tipuri de utilizatori: admin si utilizator obisnuit. Pentru autentificarea admin-ului, functia admin_login
solicita interactiv numele de utilizator si parola, le infasoara intr-un obiect JSON si trimite un request POST. Daca serverul raspunde cu codul 200, raspunsul HTTP contine un cookie de sesiune, pe care il extrage si il returneaza, altfel, retine si afiseaza eroarea si intoarce NULL; -> do_logout_admin verifica intai existenta cookie-ului de admin, construieste un GET si, la un raspuns cu status 200, sterge cookie-ul din memorie si anunta succesul, altfel afiseaza mesajele de eroare potrivite; -> pt utilizatorul normal, mecanismul este identic, doar endpoint-urile si parametrii JSON difera: user_login cere pe langa username si password si numele admin-ului asociat;
Functii de administrare utilizatori:
-> add_user, verifica prezenta cookie-ului de admin, se citesc username-ul si password, se construieste payload-ul json si se trimite un POST, incluzand
cookue-ul de admin in antet. Dc serverul raspunde cu 200/201 este succes; -> get_users, se asigura ca exista cookie-ul de admin, trimite un GET cu cookie-ul in antet, la status 200 extrage din corpul raspunsului perechile username:password; -> delete_user, verifica dc adminul e autentificat, citeste username si trimite un DELETE cu cookie-ul in antet, raporteaza succes daca utilizatorul s-a putut sterge;
Functii pt filme:
-> do_get_movies, listeaza toate filmele, trimite GET cu JWT, raporteaza lipsa acces sau afiseaza id si title;
-> do_get_movie, afiseaza deatliile unui film: citeste id, trimite GET cu JWT si afiseaza campurille filmului;
-> do_add_movie, adauga un film nou, citeste title, year, description, rating, construieste json, trimite POST cu JWT si verifica 200/201;
-> do_update_movie, actualizeaza un film existent, citeste id si campurile filmului, trimite PUT cu JWT si veriica 200;
-> do_delete_movie, sterge un film, citeste id, trimite DELETE cu JWT, trateaza erorile;
Functii pt colectii:
-> do_add_collection, citeste title si num_movies, listeaza movie_id, construieste json cu titlul colectiei si trimite POST cu JWT, extrage id
si apeleaza add_movie_to_collection pt fiecare film; -> do_get_collections, trimite GET cu JWT, afiseaza lista de filme pt fiecare colectie; -> do_get_collection, citeste id si trimite GET cu JWT, parseaza json si afiseaza id, title, owner si lista de filme; -> do_delete_collection, citeste if si trimite DELETE cu JWT; -> add_movie_to_collectionL trimite POST cu JWT si la succes afiseaza mesajul; -> do_delete_movie_from_collection: trimite DELETE cu JWT si la succes afiseaza mesajul;
-> do_get_acces, trimite un GET cu cookie de autentificare, pt succes, parseaza json si actualizeaza tokenul, afisand mesajul;