Appeler d'autres serveurs avec REQUEST et enregistrer des fichiers avec DOWNLOAD
REQUEST(options) est le client HTTP de bas niveau sur lequel est construit RESTBuilder. Passez-lui un objet et utilisez await (ou donnez-lui un callback comme deuxième argument). Les options utiles sont url, method (GET par défaut), query (un objet, ajouté à l'URL), headers, cookies, body (une chaîne ou un Buffer), type (json, text, html, xml, urlencoded ou raw, qui définit content-type), timeout en millisecondes et noredirect.
Le résultat est un objet avec status, headers, cookies et body (une chaîne ; analysez le JSON vous-même avec .parseJSON()). Une réponse avec un statut d'erreur comme 404 n'est pas une erreur : vérifiez status. La promesse n'est rejetée que lorsque la requête elle-même échoue (connexion refusée, délai dépassé, hôte invalide).
DOWNLOAD(url, filename) écrit la réponse en flux dans un fichier et se résout avec { status, size, filename }. Il ne regarde pas le statut, vérifiez-le donc avant d'utiliser le fichier.
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 });
}