Καλέστε άλλη διεύθυνση με το AJAX() από τον διακομιστή
Το AJAX('METHOD url', [data], [callback]) κάνει ένα αίτημα HTTP και σας δίνει την αναλυμένη απάντηση. Είναι η σύντομη μορφή του REQUEST() για APIs που μιλούν JSON: η ίδια κλήση που έχει το jComponent στον φυλλομετρητή, ώστε ο κώδικας της σελίδας και του διακομιστή να μοιάζουν.
- Η διεύθυνση ξεκινά με μια προαιρετική μέθοδο:
AJAX('POST [https://example.com/api/'](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('/'), ώστε να μη χρειάζεται κανέναν άλλο διακομιστή.
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);
}