==== Maquette du site de remontée des données II ====
Nous allons implémenter une api [[http://en.wikipedia.org/wiki/Representational_state_transfer|REST]]. Cela ce fait très facilement avec le module Express de nodeJS.
var pg = require('pg');
var express = require('express');
var bodyParser = require('body-parser');
var conStr = "postgres://opengeiger@localhost/opengeiger";
var app = express();
// Cette fonction est très importante, elle autorise un script
// situé ailleurs que sur le même serveur à envoyer des données
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
next();
});
app.use(bodyParser.json({strict: true}));
app.put('/add', function(req, res, next) {
console.log(req.body);
res.send("ok");
});
app.get('/', function (req, res, next) {
pg.connect(conStr, function(err, db, done) {
if (err) {
return console.error("Could not connect to PostgreSQL", err);
}
db.query("SELECT * FROM mesures_test", function(err, result) {
done(); // Release db back to the pool
if (err) {
return console.error("Error while running query", err);
}
res.json(result.rows);
});
});
});
app.listen(process.env.PORT);
Une fois le serveur lancé, nous pouvons tester l'affichage de la base de donnée avec l'url : https://open_geiger-c9-chsimon.c9.io
Pour tester l'envoi de données au serveur, nous créons une page html/javascript qui nous permet d'envoyer de fausses données :
Après ces tests concluants, il est temps d'intégrer tout ça à l'application.
Tout d'abord, nous devons autoriser l'application à communiquer avec le domaine c9. Pour cela il suffit d'ajouter cette ligne au fichier config.xml :
Ensuite, le code a ajouter est quasiment le même que celui de notre testJSON.js :
onSendToServer: function(event) {
app.xmlHttp.onreadystatechange = function() {
//if (app.xmlHttp.readyState == 4 && (app.xmlHttp.status == 200 || app.xmlHttp.status == 0)) {
//alert(app.xmlHttp.responseText);
//}
};
app.xmlHttp.open('PUT', "https://open_geiger-c9-chsimon.c9.io/add", true); // true : asynchrone false: synchrone
app.xmlHttp.setRequestHeader('Content-Type', "application/json");
var msg = JSON.stringify({
nb_coups:app.count,
latitude:app.position.coords.latitude,
longitude:app.position.coords.longitude,
altitude:app.position.coords.altitude,
timestamp:app.position.timestamp});
app.xmlHttp.send(msg);
},
La prochaine étape est d'améliorer le code côté application, pour avoir une gestion des erreurs et prendre la position gps avant chaque envoi.
Coté serveur il faut modifier l'api pour pouvoir isoler les entrées de base de donnée appartenant à la même zone ou à la même plage horaire.
* [[wiki:projets:smartphone-geiger:api|Article suivant : API d'accès aux mesures]]
* [[wiki:projets:smartphone-geiger:accueil|Retour à l'accueil]]
* [[wiki:projets:smartphone-geiger:chronologie|Retour à la chronologie du projet]]
* [[wiki:projets:smartphone-geiger:backend|Article précédent : Maquette du site de remontée des données]]