make build
- compileaza clientulmake run
- porneste clientul
Pentru un output verbose cu mesaje care arata si cererile/raspunsurile HTTP
in intregime, decomenteaza prima linie din Makefile
, apoi make clean && make
-
Codul este impartit in 3 parti majore:
- client HTTP
- procesor de comenzi
- aplicatie
-
Clientul HTTP (HTTP/Client.cpp) are urmatoarele roluri:
- deschide si inchide conexiunea cu serverul
- o instanta a acestei clase reprezinta o conexiune cu un anumit server HTTP
- trimite si primeste datele
- genereaza cererea HTTP pe baza datelor primite de la utilizator
- parseaza raspunsul primit de la server si returneaza un obiect
HTTPResponse
(contine status code, headerele, cookie-urile si body-ul primit) - tine minte eventualele cookie-uri primite si le insereaza automat in request-urile urmatoare
- face resolve name -> IP
- clasa expune utilizatorului metode pentru a face cereri GET, POST si DELETE
- utilizatorul poate specifica daca doreste ca cererea sa sa aiba headere sau cookies in plus (parametrii user_headers si user_cookies; functionalitate folosita inserarea tokenului JWT in cererile pentru librarie)
- tema a fost realizata pe Windows (debugging mai usor cu Visual Studio), iar pentru a folosi orice functie pe socket trebuie mai intai initializat modulul pentru sockets, asa ca din cauza asta exista functiile GlobalStartup si GlobalShutdown; pe Linux nu sunt folosite.
-
Procesorul de comenzi (CmdProc.cpp) proceseaza comenzile:
-
o comanda este formata din:
- numele comenzii (eg:
register
) - parametrii asteptati (eg:
username
sipassword
) - un callback care va primi ca parametru un map cu:
- key = numele prompt-ului (eg:
username
) - value = raspunsul utilizatorului
- key = numele prompt-ului (eg:
- numele comenzii (eg:
-
dispune de functii care permit adaugarea si stergerea de comenzi
-
procesorul citeste de la stdin, verifica daca s-a citit o comanda, se ofera prompt-urile (daca exista), iar la final se apeleaza callbackul asociat comenzii
- Aplicatia (App.cpp) imbina cele 2 componente de mai sus:
- se ocupa de initializarea clientului HTTP (Application::Startup)
- incepe resolve name -> IP
- inregistreaza comenzile la procesorul de comenzi
- contine functiile asociate comenzilor (eg: CMD_Login)
- toate comenzile se comporta in general la fel:
- se valideaza parametrii (daca e necesar)
- se genereaza obiectul JSON pe baza parametrilor comenzii (daca e necesar)
- se trimite cererea
- se verifica daca a aparut vreo eroare la conectare/trimitere/primire/parsare
- se verifica ce status code a dat serverul
- daca e 2xx, se afiseaza raspunsul (ex: cartile de la get_books) si un mesaj de informare
- daca nu e, se citeste campul
error
din body (daca exista) si se afiseaza status code, status text si mesajul de eroare venit de la server
- se ocupa de initializarea clientului HTTP (Application::Startup)
-
- nlohmann/json - pentru generarea obiectelor JSON pe baza inputului de la user si pentru citirea raspunsului de la server
- fmtlib - diverse formatari necesare la logging si la generarea cererii HTTP
- Cateodata cand vreau sa ma conectez la serverul HTTP sa trimit o comanda,
apelul
connect
da timeout peste 10 secunde si returneazaEAGAIN (11)
Daca se intampla asta la testare, doar mai rulati comanda o data si ar trebui sa mearga la urmatoarea incercare. - Cel mai probabil nu e de la cod, ci de la conexiunea la internet pentru ca mi se intampla ceva asemanator si in browser, dar merita mentionat totusi :)