Du coup, pour avancer, j'embraye sur la question de l'API REST. Je vous propose la spécification suivante (n'hésitez pas à donner votre avis) :
Premier jet de spec pour l'API des statistiques
Par souci d’homogénéité avec les autres API du site, les paramètres de restrictions (throttling) seront les mêmes que sur les autres modules. C'est à dire qu'un client disposant d'une clé pour l'API aura un nombre de requêtes autorisés largement supérieur à un client sans clé. Il sera donc possible d’accéder à l'API sans avoir de clé.
La différence sera au niveau de la durée du cache sur les requêtes. Étant donné que le traitement d'analyse/parsing/stockage de logs sera fait une fois par jour, nous devons avoir une taille de cache de 24h, invalidé à chaque lancement de la procédure d'analyse.
Les verbes de l'API
Tout client de l'API (y compris le site) ne doit accéder à l'API uniquement au travers de la méthode GET, il s'agit donc d'une API en lecture seule.
Les paramètres des requêtes
Les paramètres des requêtes sont les variables que l'on passent à une url de l'API sous la forme http://api_url/?v1=x&v2=yv3=z
. Dans cet exemple, v1, v2, v3 sont les paramètres de la requête.
Les paramètres sont tous facultatifs, et en cas de non renseignement d'un paramètre, la valeur par défaut sera celle spécifiée dans le fichier de paramètre (le settings.py) de zds.
Le module des statistique devra donc autoriser les paramètres suivants :
- start_date : AAAAMMJJ.
- end_date : AAAAMMJJ.
- start_time : HHMMSS.
- end_time : HHMMSS.
- depth: Int. il s'agit de la profondeur du json rendu (voir l'exemple)
- page : Int
J'ai un doute sur les paramètres nommés en anglais, mais en Français c'est pas très beau. Dites moi ce que vous en pensez
Les URLs de l'API
L'API devra mettre à disposition des clients les URLs suivantes:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | /api/contenus/:content_type/:content_id/stats/visites/
/api/contenus/:content_type/:content_id/stats/visites/sources/
/api/contenus/:content_type/:content_id/stats/visites/plateformes/
/api/contenus/:content_type/:content_id/stats/visites/plateformes/os
/api/contenus/:content_type/:content_id/stats/visites/plateformes/navigateur
/api/contenus/:content_type/:content_id/stats/visites/geo/
/api/contenus/:content_type/:content_id/stats/visites/geo/continents/
/api/contenus/:content_type/:content_id/stats/visites/geo/continents/pays/
/api/contenus/:content_type/:content_id/stats/visites/geo/continents/pays/villes
/api/contenus/:content_type/:content_id/stats/visites/geo/pays/
/api/contenus/:content_type/:content_id/stats/visites/geo/pays/villes
/api/contenus/:content_type/:content_id/stats/visites/geo/villes
/api/contenus/:content_type/:content_id/stats/visites/geo/continents/
/api/contenus/:content_type/:content_id/stats/clics_interne/
|
:content_type
: représente le type de conteneur (article, tutoriel, chapitre, partie)
:content_id
: représente l'identifiant du conteneur sur zds
J'hésite à mettre à disposition l'url /api/contenus/stats/visites/
censée renvoyer les stats globales de chaque tutoriel. ça me semble nécessaire mais je n'ai aucune idée de ce que ça demande comme puissance de calcul. Normalement le cache devrait aider, mais je n'en sais rien au moment ou j'écris ces lignes.
Un json d'exemple
Voici ce que je vise comme structure de json sur l'url /api/contenus/:content_type/:content_id/stats/visites/
pour vous donner une idée. On voit que là on a toutes les informations demandées dans la spec.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 | {
"id" : "",
"type": "",
"total_visits" : 189,
"uniques_visits": 86,
"new_visits": 8,
"avg_load_speed": 457,
"sources" :[
{
"dns": "google.fr",
"total_visits" : 189,
"uniques_visits": 86,
"new_visits": 8,
"avg_load_speed": 157
},
{
"dns": "twitter.com",
"total_visits" : 14,
"uniques_visits": 5,
"new_visits": 0,
"avg_load_speed": 447
},
{
"dns": "yahoo.fr",
"total_visits" : 189,
"uniques_visits": 86,
"new_visits": 8,
"avg_load_speed": 401
}
],
"plateformes" : {
"os": [
{
"name": "Windows",
"version": "7",
"total_visits" : 189,
"uniques_visits": 86,
"new_visits": 8,
"avg_load_speed": 401
},
{
"name": "Unknow",
"version": "Unknow",
"total_visits" : 189,
"uniques_visits": 86,
"new_visits": 8,
"avg_load_speed": 401
}
],
"navigateur": [
{
"name": "Firefox",
"version": "7",
"total_visits" : 189,
"uniques_visits": 86,
"new_visits": 8,
"avg_load_speed": 401
},
{
"name": "Google Chrome",
"version": "32",
"total_visits" : 189,
"uniques_visits": 86,
"new_visits": 8,
"avg_load_speed": 401
}
]
}
"geo" : {
"continents": {
"pays": {
"villes" : [
]
}
},
"pays": {
"villes" : [
]
},
"villes" : [
]
}
}
|
La aussi, j'ai l'impression que le mélange Français/Anglais est pas top, si vous voyez un moyen sympa, je suis prenneur
Voilà pour un premier jet de spec de l'API.