# Καλέστε άλλη διεύθυνση με το AJAX() από τον διακομιστή

> Χρησιμοποιήστε το AJAX() για να καλέσετε μια διεύθυνση HTTP με σώμα JSON και να πάρετε την αναλυμένη απάντηση, ως promise ή με callback, και μάθετε τι συμβαίνει με τα σφάλματα και το XML.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: el
Content-SHA256: 699311d9a0380de284f0fd2e32640a7b8e2ab092c0d5af27ae183b518aaa09fc
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Το `AJAX('METHOD url', [data], [callback])` κάνει ένα αίτημα HTTP και σας δίνει την **αναλυμένη** απάντηση. Είναι η σύντομη μορφή του `REQUEST()` για APIs που μιλούν JSON: η ίδια κλήση που έχει το jComponent στον φυλλομετρητή, ώστε ο κώδικας της σελίδας και του διακομιστή να μοιάζουν.

- Η διεύθυνση ξεκινά με μια προαιρετική μέθοδο: `AJAX('POST https://example.com/api/', data)`. Χωρίς μέθοδο είναι `GET`.
- Το `data`, όταν δίνεται, στέλνεται ως **σώμα JSON**. Το αίτημα φέρει την κεφαλίδα `x-requested-with: XMLHttpRequest`, οπότε στην άλλη πλευρά το `$.xhr` είναι `true`.
- Η απάντηση αναλύεται σύμφωνα με τον τύπο περιεχομένου της: το JSON γίνεται αντικείμενο, το `application/x-www-form-urlencoded` γίνεται αντικείμενο και οτιδήποτε άλλο φτάνει ως κείμενο.
- Όταν η κατάσταση είναι 400 ή μεγαλύτερη, το promise **απορρίπτεται** (ή το callback παίρνει πρώτα το σφάλμα) με το αναλυμένο σώμα της απάντησης ως σφάλμα. Ένα callback καλείται ως `callback(err, value, response)`.
- Χωρίς callback επιστρέφει ένα promise.

**Για απαντήσεις XML χρησιμοποιήστε το `REQUEST()`** και αναλύστε μόνοι σας το σώμα: το `AJAX()` είναι φτιαγμένο για απαντήσεις JSON και κειμένου.

Το παράδειγμα καλεί διαδρομές της ίδιας εφαρμογής, των οποίων τη διεύθυνση δίνει το `$.hostname('/')`, ώστε να μη χρειάζεται κανέναν άλλο διακομιστή.

```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);
}
```
