2022-12-01 14:14:19 +01:00
|
|
|
# Projet webservices
|
2022-12-01 14:49:41 +01:00
|
|
|
|
|
|
|
## Composants
|
|
|
|
|
|
|
|
Un serveur fournit un service par le biais d'une API, qui est requêtée par deux clients.
|
|
|
|
|
|
|
|
Pour certaines fonctionnalités, le serveur doit faire des requêtes auprès d'une API publique.
|
|
|
|
Il doit donc embarquer une fonctionnalité de client auprès de l'API publique.
|
|
|
|
|
|
|
|
## Languages
|
|
|
|
|
|
|
|
Le serveur est écrit en Rust.
|
|
|
|
Le composant "client" du serveur, qui requête l'API publique, est également écrit en Rust.
|
|
|
|
|
|
|
|
Deux clients sont écrits, un en Rust, l'autre en Python.
|
2022-12-01 15:04:51 +01:00
|
|
|
|
2022-12-02 16:22:22 +01:00
|
|
|
## Fonctionnalités
|
|
|
|
|
2022-12-27 23:21:44 +01:00
|
|
|
- fonction de recherche : l'utilisateur écrit un mot ou une expression, et on fait la requête auprès de Mirabel correspondant :
|
|
|
|
* exemple :
|
|
|
|
`https://hephaistos.efrei/api/v1/editeur/j*-claude`
|
|
|
|
=> `expression = 'j*-claude'`
|
|
|
|
=> recherche SQL locale pour trouver l'ID du ou des éditeurs qui matchent
|
|
|
|
=> https://reseau-mirabel.info/api/editeurs/{id}
|
|
|
|
* idem avec `titres`
|
|
|
|
- fonction de stockage de favoris :
|
|
|
|
* POST /editeur/jean-claude
|
|
|
|
=> `INSERT INTO favoris VALUES ('jean-claude');`
|
|
|
|
=> réponse 200
|
|
|
|
- fonction de stockage de l'historique de recherche (global pour ne pas devoir gérer les utilisateurs).
|
|
|
|
- api GET pour retourner les éléments recherchés (historique)
|
|
|
|
- api GET pour retourner les éléments favoris
|
|
|
|
=> retourne des éléments de la base de données, fonction locale donc
|
|
|
|
|
2022-12-02 16:22:22 +01:00
|
|
|
![architecture](./img/archi.png)
|
|
|
|
|
|
|
|
### Client - Artemis (Python)
|
|
|
|
|
|
|
|
### Client - Kratos (Rust)
|
|
|
|
|
|
|
|
### Serveur - Hephaïstos
|
|
|
|
|
2022-12-08 17:37:10 +01:00
|
|
|
- `receive_request`
|
2022-12-02 16:22:22 +01:00
|
|
|
Serveur HTTP en `listen` pour recevoir les requêtes API REST en provenance d'un client (Artemis ou Kratos).
|
2022-12-08 17:37:10 +01:00
|
|
|
Envoie l'URL reçu à `parse_url`.
|
|
|
|
- `parse_url`
|
|
|
|
Reçoit l'URL par `receive_request` et détermine la fonction à appeler.
|
2022-12-02 16:22:22 +01:00
|
|
|
- `get_data`
|
|
|
|
Reçoit les informations de la part de `parse_given_url`, et fait les choses suivantes :
|
|
|
|
* Requête `sql_cache` pour trouver les données localement.
|
|
|
|
* S'il les trouve, envoie les données à `transform_to_json`
|
|
|
|
* S'il ne les trouve pas, requête `api_client` et attend le retour (booléen qui lui indique que l'écriture a fonctionné)
|
|
|
|
* Une fois le retour positif, nouvelle requête `sql_cache`, puis idem, si donnée absente etc.
|
|
|
|
Le tout peut être mis dans une boucle `while not sql_content`.
|
|
|
|
- `sql_cache`
|
|
|
|
Base de données SQL qui sert de cache local et qui est requêtée par `get_data` (lecture) et `api_client` (écriture).
|
|
|
|
- `api_client`
|
|
|
|
Effectue les requêtes d'API REST auprès de VirusTotal.
|
|
|
|
Quand il reçoit des données valides, il les ajoute à `sql_cache`.
|
|
|
|
Retourne un booléen pour indiquer le succès ou l'échec de l'`insert`.
|
|
|
|
- `transform_to_json`
|
|
|
|
Fonction qui reçoit des données en provenance de `get_data` pour en faire du JSON et les envoie à `send_data`.
|
|
|
|
- `send_data`
|
|
|
|
Envoie les données au client (Artemis ou Kratos).
|