ForgeTotal.js 5
hu

Total.js 5

Másik cím hívása az AJAX()-szal a szerverről

Total.js 5 · total5@0.0.19 httprequestsajax Total.js 5-tel lefuttatva

Az AJAX('METHOD url', [data], [callback]) HTTP-kérést küld, és az értelmezett választ adja. A REQUEST() rövid alakja JSON-nal beszélő API-khoz: ugyanaz a hívás, amely a jComponentben a böngészőben is megvan, így az oldal és a szerver kódja hasonlít egymásra.

  • A cím egy opcionális metódussal kezdődik: AJAX('POST [https://example.com/api/'](https://example.com/api/'), data). Metódus nélkül GET.
  • A data-t, ha meg van adva, JSON törzsként küldi el. A kérés az x-requested-with: XMLHttpRequest fejlécet hordozza, így a másik oldalon a $.xhr értéke true.
  • A választ a tartalomtípusa szerint értelmezi: a JSON objektummá válik, az application/x-www-form-urlencoded objektummá válik, minden más szövegként érkezik.
  • Ha az állapot 400 vagy nagyobb, a promise elutasításra kerül (vagy a callback először a hibát kapja) a válasz értelmezett törzsével mint hibával. A callback callback(err, value, response) alakban hívódik meg.
  • Callback nélkül promise-t ad vissza.

XML-válaszokhoz használd a REQUEST() függvényt, és a törzset magad elemezd: az AJAX() JSON- és szövegválaszokra való.

A példa ugyanazon alkalmazás útvonalait hívja, amelyek címét a $.hostname('/') adja, így nincs szüksége másik szerverre.

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