2016-02-14 20:22:07 +00:00
|
|
|
/* classe API */
|
2016-07-02 15:10:41 +00:00
|
|
|
function APIClass(target){ this.target = target; }
|
2016-02-14 20:22:07 +00:00
|
|
|
|
|
|
|
APIClass.prototype = {
|
|
|
|
xhr: [], // tableau d'objets pour les requêtes ajax
|
2016-07-02 15:10:41 +00:00
|
|
|
buffer: null, // Contiendra le buffer pour debugger si erreur de parsage
|
|
|
|
optionalParams: [], // Contiendra les paramètres que l'on veut passer au scope de @pHandler
|
2016-02-14 20:22:07 +00:00
|
|
|
|
|
|
|
/* transaction avec le serveur (http://host/api/)
|
|
|
|
*
|
2016-07-02 15:10:41 +00:00
|
|
|
* @param pRequest<Object> l'objet passé en POST (attribut->postfield) à http://host/api/
|
2016-02-14 20:22:07 +00:00
|
|
|
* @param pHandler<Function> fonction qui s'éxécutera lors de la réponse (1 argument -> réponse<Object>)
|
2016-07-02 15:10:41 +00:00
|
|
|
* @param pToken<String> Optionnel, token d'auth pour l'api
|
|
|
|
* @param pParams<Mixed> Optionnels, liste d'arguments à passer au scope de @pHandler
|
2016-02-14 20:22:07 +00:00
|
|
|
*
|
2016-07-02 15:10:41 +00:00
|
|
|
* @return answer<Object> l'objet retourné par http://host/api/ via pHandler (1er argument)
|
2016-02-14 20:22:07 +00:00
|
|
|
*
|
|
|
|
***************************************************************************************************
|
|
|
|
*
|
|
|
|
* @usecase
|
|
|
|
* 1. var answerObject = sendRequest(
|
2016-07-02 15:10:41 +00:00
|
|
|
* 2. { var1: "exemple", var2: 198294 },
|
|
|
|
* 3. function(rep){ alert(rep); }
|
2016-02-14 20:22:07 +00:00
|
|
|
* 4. );
|
|
|
|
* @explain
|
2016-07-02 15:10:41 +00:00
|
|
|
* 1. on appelle la fonction <=> on créé la requête
|
|
|
|
* 2. on passe l'objet qui sera envoyé
|
2016-02-14 20:22:07 +00:00
|
|
|
* 3. on passe une fonction qui utilise un argument (sera la réponse de http://host/api/) (sous forme d'objet)
|
|
|
|
*
|
|
|
|
*/
|
2016-07-02 15:10:41 +00:00
|
|
|
send: function(pRequest, pHandler, pToken){
|
2016-02-14 20:22:07 +00:00
|
|
|
|
|
|
|
// Si le chemin de delegation n'est pas renseigne, on renvoie une erreur
|
|
|
|
if( !pRequest.hasOwnProperty('path') )
|
2016-02-16 08:35:37 +00:00
|
|
|
pHandler({ModuleError:4});
|
2016-02-14 20:22:07 +00:00
|
|
|
|
|
|
|
// on efface les requêtes qui sont terminées (toutes celles de this.xhr)
|
2016-07-02 15:10:41 +00:00
|
|
|
for( var i = 0 ; i < this.xhr.length ; i++ )
|
2016-02-14 20:22:07 +00:00
|
|
|
if( this.xhr[i].readyState == 4 ) // si terminée
|
2016-07-02 15:10:41 +00:00
|
|
|
this.xhr.splice(i, 1);
|
|
|
|
|
2016-02-14 20:22:07 +00:00
|
|
|
|
|
|
|
// on créé une nouvelle entrée
|
|
|
|
this.xhr.push(null);
|
|
|
|
i = this.xhr.length-1;
|
|
|
|
|
2016-07-02 15:10:41 +00:00
|
|
|
|
|
|
|
// Gestion des paramètres optionnels à passer au scope de @pHandler
|
|
|
|
this.optionalParams[i] = [];
|
|
|
|
if( arguments.length > 3 )
|
|
|
|
for( var arg = 3 ; arg < arguments.length ; arg++ )
|
|
|
|
this.optionalParams[i].push( arguments[arg] );
|
|
|
|
|
|
|
|
|
2016-02-14 20:22:07 +00:00
|
|
|
// création de l'objet AJAX
|
2016-07-12 13:16:07 +00:00
|
|
|
if(window.XMLHttpRequest) this.xhr[i] = new XMLHttpRequest(); // IE7+, Firefox, Chrome, Opera, Safari
|
|
|
|
else this.xhr[i] = new ActiveXObject('Microsoft.XMLHttpRequest'); // IE5, IE6
|
2016-02-14 20:22:07 +00:00
|
|
|
|
|
|
|
var ptrAPI = this;
|
|
|
|
this.xhr[i].onreadystatechange = function(){
|
|
|
|
if( ptrAPI.xhr[i].readyState == 4 ){ // si la requête est terminée
|
|
|
|
|
2016-07-12 13:16:07 +00:00
|
|
|
// On met à jour le BUFFER (pour debugger)
|
2016-07-02 15:10:41 +00:00
|
|
|
ptrAPI.buffer = ptrAPI.xhr[i].responseText;
|
2016-02-14 20:22:07 +00:00
|
|
|
|
2016-07-02 15:10:41 +00:00
|
|
|
console.log('api request', pRequest);
|
|
|
|
|
2016-02-14 20:22:07 +00:00
|
|
|
/* si success de requête */
|
2016-07-12 13:16:07 +00:00
|
|
|
if( [0,200,417].indexOf(ptrAPI.xhr[i].status) > -1 ){ // si fichier existe et reçu
|
2017-10-27 16:00:53 +00:00
|
|
|
|
|
|
|
// Récupération token TreeToken
|
|
|
|
window._token_ = ptrAPI.xhr[i].getResponseHeader('X-Tree-Token');
|
|
|
|
|
2016-07-12 13:16:07 +00:00
|
|
|
var parsedResponse = {ModuleError:-1, ErrorDescription:'Erreur au niveau de api.js'};
|
|
|
|
|
|
|
|
// On essaie de parser le json
|
|
|
|
try{
|
|
|
|
parsedResponse = JSON.parse(ptrAPI.xhr[i].responseText);
|
|
|
|
}catch(e){}
|
|
|
|
|
|
|
|
// On lance la handler
|
|
|
|
console.log('api response', parsedResponse);
|
2016-10-18 14:03:03 +00:00
|
|
|
|
2016-07-12 13:16:07 +00:00
|
|
|
if( parsedResponse.hasOwnProperty('ModuleError') && parsedResponse.ModuleError != 0 )
|
|
|
|
console.error('ModuleError::'+parsedResponse.ModuleError);
|
|
|
|
|
|
|
|
pHandler(parsedResponse, ptrAPI.optionalParams[i]);
|
|
|
|
|
2016-02-14 20:22:07 +00:00
|
|
|
}
|
|
|
|
/* sinon retourne obj.request = 'unreachable' */
|
|
|
|
else
|
2016-07-12 13:16:07 +00:00
|
|
|
pHandler({ModuleError:-2, ModuleDescription:'Erreur au niveau d\'AJAX.'});
|
2016-02-14 20:22:07 +00:00
|
|
|
|
|
|
|
}
|
2016-07-02 15:10:41 +00:00
|
|
|
};
|
2016-02-14 20:22:07 +00:00
|
|
|
|
|
|
|
// on créé un formulaire POST (virtuel)
|
|
|
|
var form = new FormData();
|
|
|
|
|
2016-07-02 15:10:41 +00:00
|
|
|
// On ajoute tous les attributs en POST
|
|
|
|
for( var key in pRequest )
|
|
|
|
// On envoie le 'path' tel quel <String>
|
|
|
|
if( key == 'path' ) form.append(key, pRequest[key]);
|
|
|
|
// On envoie un fichier tel quel <File>
|
|
|
|
else if( pRequest[key] instanceof File ) form.append(key, pRequest[key]);
|
|
|
|
// On envoie le reste en JSON
|
|
|
|
else form.append(key, JSON.stringify(pRequest[key]));
|
|
|
|
|
2016-02-14 20:22:07 +00:00
|
|
|
|
|
|
|
this.xhr[i].open('POST', this.target, true);
|
2016-07-02 15:10:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
// Gestion du token optionnel
|
2017-10-27 16:00:53 +00:00
|
|
|
if( pToken != null )
|
|
|
|
this.xhr[i].setRequestHeader('Authorization', 'Digest '+pToken);
|
|
|
|
|
|
|
|
// Gestion du token (TreeToken)
|
|
|
|
if( window._token_ == null )
|
|
|
|
this.xhr[i].setRequestHeader('X-Tree-Token', JSON.parse('{"'+document.cookie.replace(/=/g,'":"').replace(/; /g,'","')+'"}')._PUBLIC_);
|
|
|
|
else
|
|
|
|
this.xhr[i].setRequestHeader('X-Tree-Token', window._token_);
|
2016-07-02 15:10:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
// Header pour dire que c'est AJAX
|
|
|
|
this.xhr[i].setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-02-14 20:22:07 +00:00
|
|
|
this.xhr[i].send( form );
|
|
|
|
|
|
|
|
}
|
2017-10-27 16:00:53 +00:00
|
|
|
};
|