Κλήση άλλων διακομιστών με REQUEST και αποθήκευση αρχείων με DOWNLOAD
Το REQUEST(options) είναι ο πελάτης HTTP χαμηλού επιπέδου πάνω στον οποίο είναι χτισμένο το RESTBuilder. Δώστε του ένα αντικείμενο και χρησιμοποιήστε await (ή δώστε του ένα callback ως δεύτερο όρισμα). Οι χρήσιμες επιλογές είναι url, method (προεπιλογή GET), query (ένα αντικείμενο που προστίθεται στο URL), headers, cookies, body (ένα κείμενο ή ένα Buffer), type (json, text, html, xml, urlencoded ή raw, που ορίζει το content-type), timeout σε χιλιοστά του δευτερολέπτου και noredirect.
Το αποτέλεσμα είναι ένα αντικείμενο με status, headers, cookies και body (ένα κείμενο· αναλύστε μόνοι σας το JSON με το .parseJSON()). Μια απάντηση με κατάσταση σφάλματος όπως 404 δεν είναι σφάλμα: ελέγξτε το status. Το promise απορρίπτεται μόνο όταν αποτύχει το ίδιο το αίτημα (άρνηση σύνδεσης, timeout, μη έγκυρος host).
Το DOWNLOAD(url, filename) στέλνει την απάντηση σε ένα αρχείο και επιλύεται με { status, size, filename }. Δεν κοιτάζει την κατάσταση, γι' αυτό ελέγξτε την πριν χρησιμοποιήσετε το αρχείο.
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 });
}