ForgeTotal.js 5
sv

Total.js 5

Anropa andra servrar med REQUEST och spara filer med DOWNLOAD

Total.js 5 · total5@0.0.19 httprequestdownload Körd med Total.js 5

REQUEST(options) är den HTTP-klient på låg nivå som RESTBuilder bygger på. Ge den ett objekt och använd await (eller ge den en callback som andra argument). De användbara alternativen är url, method (standard GET), query (ett objekt som läggs till i URL:en), headers, cookies, body (en sträng eller en Buffer), type (json, text, html, xml, urlencoded eller raw, som sätter content-type), timeout i millisekunder och noredirect.

Resultatet är ett objekt med status, headers, cookies och body (en sträng; tolka JSON själv med .parseJSON()). Ett svar med en felstatus som 404 är inte ett fel: kontrollera status. Löftet (promise) avvisas bara när själva förfrågan misslyckas (anslutning vägrad, timeout, ogiltig värd).

DOWNLOAD(url, filename) strömmar svaret till en fil och uppfylls med { status, size, filename }. Den tittar inte på statusen, så kontrollera den innan du använder filen.

controllers/request.js
exports.install = function() {
	ROUTE('GET /remote/', remote);
	ROUTE('POST /remote/ @json', remote_post);
	ROUTE('GET /remote/text/', remote_text);
	ROUTE('GET /call/', call);
	ROUTE('GET /download/', download);
};

function remote($) {
	$.json({ hello: 'world', name: $.query.name || null });
}

function remote_post($) {
	$.json({ received: $.body, token: $.headers['x-token'] || null });
}

function remote_text($) {
	$.plain('first line\nsecond line\n');
}

async function call($) {

	var get = await REQUEST({ url: $.hostname('/remote/'), query: { name: 'Louis' } });
	var post = await REQUEST({ method: 'POST', url: $.hostname('/remote/'), type: 'json', body: JSON.stringify({ a: 1 }), headers: { 'x-token': 'abc' } });
	var missing = await REQUEST({ url: $.hostname('/does-not-exist/') });

	var failed = null;
	try {
		await REQUEST({ url: 'http://127.0.0.1:1/' });
	} catch (e) {
		failed = true;
	}

	$.json({
		get: get.body.parseJSON(),
		post: post.body.parseJSON(),
		status: [get.status, missing.status],
		failed: failed
	});
}

async function download($) {
	var filename = PATH.tmp('forge-download.txt');
	var response = await DOWNLOAD($.hostname('/remote/text/'), filename);
	var content = require('fs').readFileSync(filename).toString('utf8');
	$.json({ status: response.status, size: response.size, content: content });
}