ForgeTotal.js 5
ro

Total.js 5

Apelează o altă adresă cu AJAX() de pe server

Total.js 5 · total5@0.0.19 httprequestsajax Executată cu Total.js 5

AJAX('METHOD url', [data], [callback]) face o cerere HTTP și îți dă răspunsul parsat. Este forma scurtă a lui REQUEST() pentru API-uri care vorbesc JSON: același apel pe care îl are jComponent în browser, astfel încât codul paginii și cel al serverului seamănă.

  • Adresa începe cu o metodă opțională: AJAX('POST [https://example.com/api/'](https://example.com/api/'), data). Fără metodă este un GET.
  • data, când este dat, se trimite ca corp JSON. Cererea poartă antetul x-requested-with: XMLHttpRequest, deci pe cealaltă parte $.xhr este true.
  • Răspunsul este parsat după tipul său de conținut: JSON devine un obiect, application/x-www-form-urlencoded devine un obiect, orice altceva ajunge ca text.
  • Când starea este 400 sau mai mare, promisiunea este respinsă (sau callbackul primește mai întâi eroarea) cu corpul parsat al răspunsului ca eroare. Un callback este apelat ca callback(err, value, response).
  • Fără callback returnează o promisiune.

Pentru răspunsuri XML folosește REQUEST() și analizează tu corpul: AJAX() este făcut pentru răspunsuri JSON și text.

Exemplul apelează rute ale aceleiași aplicații, a căror adresă o dă $.hostname('/'), astfel încât nu are nevoie de niciun alt server.

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