2016-04-04 09:47:17 +00:00
/* classe API */
2016-04-19 13:30:33 +00:00
function APIClass ( target ) { this . target = target ; }
2016-04-04 09:47:17 +00:00
APIClass . prototype = {
xhr : [ ] , // tableau d'objets pour les requêtes ajax
2016-05-24 07:01:16 +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-04-04 09:47:17 +00:00
/* transaction avec le serveur (http:/ / host / api / )
*
2016-04-20 09:59:21 +00:00
* @ param pRequest < Object > l ' objet passé en POST ( attribut - > postfield ) à http : //host/api/
2016-04-04 09:47:17 +00:00
* @ param pHandler < Function > fonction qui s ' éxécutera lors de la réponse ( 1 argument - > réponse < Object > )
2016-05-24 07:01:16 +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-04-04 09:47:17 +00:00
*
2016-04-18 06:42:26 +00:00
* @ return answer < Object > l ' objet retourné par http : //host/api/ via pHandler (1er argument)
2016-04-04 09:47:17 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* @ usecase
* 1. var answerObject = sendRequest (
2016-04-18 06:42:26 +00:00
* 2. { var1 : "exemple" , var2 : 198294 } ,
* 3. function ( rep ) { alert ( rep ) ; }
2016-04-04 09:47:17 +00:00
* 4. ) ;
* @ explain
2016-04-18 06:42:26 +00:00
* 1. on appelle la fonction <= > on créé la requête
* 2. on passe l ' objet qui sera envoyé
2016-04-04 09:47:17 +00:00
* 3. on passe une fonction qui utilise un argument ( sera la réponse de http : //host/api/) (sous forme d'objet)
*
* /
2016-04-11 10:20:34 +00:00
send : function ( pRequest , pHandler , pToken ) {
2016-04-04 09:47:17 +00:00
// Si le chemin de delegation n'est pas renseigne, on renvoie une erreur
if ( ! pRequest . hasOwnProperty ( 'path' ) )
pHandler ( { ModuleError : 4 } ) ;
// on efface les requêtes qui sont terminées (toutes celles de this.xhr)
2016-05-24 07:01:16 +00:00
for ( var i = 0 ; i < this . xhr . length ; i ++ )
2016-04-04 09:47:17 +00:00
if ( this . xhr [ i ] . readyState == 4 ) // si terminée
2016-05-24 07:01:16 +00:00
this . xhr . splice ( i , 1 ) ;
2016-04-04 09:47:17 +00:00
// on créé une nouvelle entrée
this . xhr . push ( null ) ;
i = this . xhr . length - 1 ;
2016-05-24 07:01:16 +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-04-04 09:47:17 +00:00
// création de l'objet AJAX
if ( window . XMLHttpRequest ) // IE7+, Firefox, Chrome, Opera, Safari
this . xhr [ i ] = new XMLHttpRequest ( ) ;
2016-04-18 06:42:26 +00:00
else // IE5, IE6
2016-04-04 09:47:17 +00:00
this . xhr [ i ] = new ActiveXObject ( 'Microsoft.XMLHttpRequest' ) ;
var ptrAPI = this ;
this . xhr [ i ] . onreadystatechange = function ( ) {
if ( ptrAPI . xhr [ i ] . readyState == 4 ) { // si la requête est terminée
2016-05-09 09:01:43 +00:00
ptrAPI . buffer = ptrAPI . xhr [ i ] . responseText ;
2016-04-04 09:47:17 +00:00
/* DEBUG : affiche la réponse BRUTE de http://host/api/ */
2016-04-30 14:50:46 +00:00
// console.log('http://host/api/ => '+ptrAPI.xhr[i].responseText);
2016-04-19 13:30:33 +00:00
// console.log( JSON.parse(ptrAPI.xhr[i].responseText) );
2016-04-04 09:47:17 +00:00
2016-05-24 07:01:16 +00:00
console . log ( 'api request' , pRequest ) ;
2016-04-04 09:47:17 +00:00
/* si success de requête */
if ( [ 0 , 200 ] . indexOf ( ptrAPI . xhr [ i ] . status ) > - 1 ) { // si fichier existe et reçu
2016-05-24 07:01:16 +00:00
try { pHandler ( JSON . parse ( ptrAPI . xhr [ i ] . responseText ) , ptrAPI . optionalParams [ i ] ) ; } // si on peut parser, on envoie
catch ( e ) { pHandler ( { ModuleError : - 1 , ErrorDescription : 'Erreur au niveau de api.js' } , ptrAPI . optionalParams [ i ] ) ; console . warn ( e ) ; } // sinon on envoie obj.request = 'corrupted'
2016-04-04 09:47:17 +00:00
}
/* sinon retourne obj.request = 'unreachable' */
else
pHandler ( { ModuleError : 3 } ) ;
}
2016-04-19 13:30:33 +00:00
} ;
2016-04-04 09:47:17 +00:00
// on créé un formulaire POST (virtuel)
var form = new FormData ( ) ;
2016-04-12 13:16:10 +00:00
// On ajoute tous les attributs en POST
for ( var key in pRequest )
2016-05-03 07:44:25 +00:00
// 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-04-11 10:20:34 +00:00
2016-04-04 09:47:17 +00:00
this . xhr [ i ] . open ( 'POST' , this . target , true ) ;
2016-04-11 10:20:34 +00:00
// Gestion du token optionnel
2016-10-11 10:44:53 +00:00
pToken && this . xhr [ i ] . setRequestHeader ( 'Authorization' , 'Digest ' + pToken ) ;
2016-04-11 10:20:34 +00:00
2016-05-18 20:49:02 +00:00
// Header pour dire que c'est AJAX
this . xhr [ i ] . setRequestHeader ( 'X-Requested-With' , 'XMLHttpRequest' ) ;
2016-04-04 09:47:17 +00:00
this . xhr [ i ] . send ( form ) ;
}
} ;