Appeler une autre adresse avec AJAX() depuis le serveur
AJAX('METHOD url', [data], [callback]) fait une requête HTTP et vous donne la réponse analysée. C'est la forme courte de REQUEST() pour les API qui parlent JSON : le même appel que jComponent a dans le navigateur, si bien que le code de la page et celui du serveur se ressemblent.
- L'adresse commence par une méthode facultative :
AJAX('POST [https://example.com/api/'](https://example.com/api/'), data). Sans méthode, c'est unGET. data, quand il est donné, est envoyé comme corps JSON. La requête porte l'en-têtex-requested-with: XMLHttpRequest, de sorte que de l'autre côté$.xhrvauttrue.- La réponse est analysée selon son type de contenu : le JSON devient un objet,
application/x-www-form-urlencodeddevient un objet et tout le reste arrive sous forme de texte. - Quand l'état est 400 ou plus, la promesse est rejetée (ou le callback reçoit d'abord l'erreur) avec le corps analysé de la réponse comme erreur. Un callback est appelé sous la forme
callback(err, value, response). - Sans callback, la fonction renvoie une promesse.
Pour les réponses XML, utilisez REQUEST() et analysez vous-même le corps : AJAX() est conçu pour les réponses JSON et texte.
L'exemple appelle des routes de la même application, dont l'adresse est donnée par $.hostname('/'), de sorte qu'il n'a besoin d'aucun autre serveur.
exports.install = function() {
ROUTE('GET /api/hello/', hello);
ROUTE('POST /api/echo/', echo);
ROUTE('GET /api/text/', text);
ROUTE('GET /api/xml/', xml);
ROUTE('GET /api/fail/', fail);
ROUTE('GET /calls/', calls);
};
function hello($) {
$.json({ hello: 'world', xhr: $.xhr });
}
function echo($) {
$.json({ received: $.body, xhr: $.xhr });
}
function text($) {
$.plain('plain text');
}
function xml($) {
$.xml('<a><b>1</b></a>');
}
function fail($) {
$.invalid('It is wrong');
}
async function calls($) {
const base = $.hostname('/');
const out = {};
out.hello = await AJAX('GET ' + base + 'api/hello/');
out.nomethod = await AJAX(base + 'api/hello/');
out.echo = await AJAX('POST ' + base + 'api/echo/', { a: 1 });
out.text = await AJAX(base + 'api/text/');
try {
await AJAX(base + 'api/fail/');
} catch (err) {
out.error = err.message || err;
}
out.callback = await new Promise(resolve => AJAX(base + 'api/hello/', (err, value, response) => resolve({ err: err, hello: value.hello, status: response.status })));
out.xml = await Promise.race([
AJAX(base + 'api/xml/').then(() => 'answered', () => 'rejected'),
new Promise(resolve => setTimeout(() => resolve('never answered'), 1000))
]);
$.json(out);
}