# Appeler une autre adresse avec AJAX() depuis le serveur

> Utilisez AJAX() pour appeler une adresse HTTP avec un corps JSON et obtenir la réponse analysée, sous forme de promesse ou avec un callback, et sachez ce qui se passe avec les erreurs et le XML.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: fr
Content-SHA256: 225d3ab18782a7ff72b54fecb03329fcfee7083d84ed9ab3e6d57417259961ae
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`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/', data)`. Sans méthode, c'est un `GET`.
- `data`, quand il est donné, est envoyé comme **corps JSON**. La requête porte l'en-tête `x-requested-with: XMLHttpRequest`, de sorte que de l'autre côté `$.xhr` vaut `true`.
- La réponse est analysée selon son type de contenu : le JSON devient un objet, `application/x-www-form-urlencoded` devient 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.

```js controllers/calls.js
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);
}
```
