HTTPS Request con Node.js (e JSON di risposta)

Node.js ed io, chi lo avrebbe mai detto? Eppure durante uno dei miei primi esperimenti sul portale Alexa Developer Console mi sono imbattuo nel scrivere una psuedo skill di test utilizzando il template proposto. Lo scopo di questo esperimento era di ricevere i dati da una API su Azure e farli riprodurre dal dispositivo. L’unico dilemma -non avendo mai sviluppato in Node.js- era sul come chiamare la mia API. ⬇️

Node.js Design Patterns: Design and implement production-grade Node.js applications using proven patterns and techniques

https.request

Per prima cosa, se volete effettuare una chiamata https.request dovete definire https e vi basterà farlo una volta sola nel file

1
var https = require('https');

Per semplificarmi la vita (e potere riciclare il codice in altre occasioni) ho scritto la funzione httpGet alla quale passo un parametro typeOfFilter per poi girarlo alla mia API come querystring.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function httpGet(typeOfFilter) {
    
  return new Promise(((resolve, reject) => {
    var options = {
        host: '00000000000000000000000000000000.azurewebsites.net',
        port: 443,
        path: '/api/BlaBlaBla?type=' + typeOfFilter ,
        method: 'GET'
    };
    

    const request = https.request(options, (response) => {
        
      response.setEncoding('utf8');
      let returnData = '';

      response.on('data', (chunk) => {
        returnData += chunk;
      });

      response.on('end', () => {
            resolve(JSON.parse(returnData));
      });

      response.on('error', (error) => {
          throw error;
      });
    });
    
    request.end();
  }));
  
}

https.request - valore di ritorno

Come potete notare all’interno del precedente codice andiamo a salvare il valore di ritorno (json) della nostra API nella variabile returnData

1
2
3
response.on('data', (chunk) => {
    returnData += chunk;
});

ed in seguito andremo ad effettuare il parse dello stesso per poterlo restituire

1
2
3
response.on('end', () => {
    resolve(JSON.parse(returnData));
});

function httpGet: come attivarla?

A questo punto manca un solo passaggio abbastanza fondamentale: come chiamo la function httpGet scritta in precendenza?

1
2
3
4
5
6
7
[...]
async handle(handlerInput) {
  
        const response = await httpGet('01');
        
},
[...]

Vorrei fare notare la presenza di async/await per effettuare la chiamata della API.