2016-01-17 33 views
7

Sono nuovo al nodo e devo chiamare un API di terze parti dal mio codice. Ho trovato come farlo utilizzando http.request da questo collegamento https://docs.nodejitsu.com/articles/HTTP/clients/how-to-create-a-HTTP-request. Quello che devo fare è chiamare due diversi api urls e usare i dati di risposta della prima chiamata nella seconda chiamata che sarà solo un id come parametro su resource2.Richiesta http del nodo multiplo di catena

Non so come concatenare due di queste chiamate insieme senza che si tratti di un pasticcio duplicato. Qualsiasi aiuto sarebbe apprezzato.

var url1 = { 
    host: 'www.domain.com', 
    path: '/api/resourse1' 
}; 

var url2 = { 
    host: 'www.domain.com', 
    path: '/api/resourse2/{id}' 
}; 

var callback = function (response) { 
    var str = ''; 

    response.on('data', function (chunk) { 
     str += chunk; 
    }); 

    response.on('end', function() { 
     console.log(str); 
    }); 
} 

http.request(url1, callback).end(); 

risposta

23

In primo luogo, ti consigliamo di dare un'occhiata a request, che è la scelta più popolare per le richieste HTTP, grazie alla sua semplicità.

In secondo luogo, possiamo combinare la semplicità della richiesta con il concetto di Promises, per rendere più richieste in successione, mantenendo il codice piatto.
Utilizzando request-promise

var rp = require('request-promise') 
var url1 = {} 
var url2 = {} 
var url3 = {} 


rp(url1) 
    .then(response => { 
    // add stuff from url1 response to url2 
    return rp(url2) 
    }) 
    .then(response => { 
    // add stuff from url2 response to url3 
    return rp(url3) 
    }) 
    .then(response => { 
    // do stuff after all requests 

    // If something went wrong 
    // throw new Error('messed up') 
    }) 
    .catch(err => console.log) // Don't forget to catch errors 

Come si può vedere, si può aggiungere il maggior numero di richieste come vogliamo, e il codice rimarrà piatta e semplice. Come bonus, siamo stati in grado di aggiungere anche la gestione degli errori. Usando i callback tradizionali, dovresti aggiungere la gestione degli errori ad ogni callback, mentre qui dobbiamo farlo solo una volta alla fine della catena Promise.

UPDATE (16/09): Mentre promesse ci portano a metà strada, ulteriormente l'esperienza mi ha convinto che promette solo ottenere disordinato quando c'è un sacco di miscelazione tra sincronizzazione, il codice asincrono, e soprattutto controllare il flusso (ad esempio, se -altro). Il modo canonico per risolvere questo sarebbe con async/await, tuttavia che è ancora in fase di sviluppo e richiederebbe la transpilation. Come tale, generators sono la prossima soluzione migliore.

Utilizzando co

var co = require('co') 
var rp = require('request-promise') 
var url1 = {} 
var url2 = {} 
var url3 = {} 

co(function*() { 
    var response 
    response = yield rp(url1) 
    // add stuff from url1 response to url2 
    response = yield rp(url2) 
    // add stuff from url2 response to url3 
    response = yield rp(url3) 

    // do stuff after all requests 

    // If something went wrong 
    // throw new Error('messed up') 
}) 
.catch(err => console.log) // Don't forget to catch errors 

UPDATE (12/16): Ora che l'ultima versione del nodo al momento della scrittura (7.2.1) supporta async/await dietro la bandiera --harmony, si potrebbe fare this:

const rp = require('request-promise') 
const url1 = {} 
const url2 = {} 
const url3 = {} 

async function doRequests() { 
    let response 
    response = await rp(url1) 
    // add stuff from url1 response to url2 
    response = await rp(url2) 
    // add stuff from url2 response to url3 
    response = await rp(url3) 

    // do stuff after all requests 

    // If something went wrong 
    // throw new Error('messed up') 
} 

doRequests() 
.catch(err => console.log) // Don't forget to catch errors 
+0

Circa la risposta che stavo scrivendo. Sia l'uso di 'richiesta' che l'utilizzo di Promises sono ottimi suggerimenti. –

+0

Grazie, ma sto ottenendo dichiarazione di espressione non è un compito o una chiamata. C'è un'altra libreria che ho bisogno di aggiungere oltre alla richiesta-promettente? .then (response => { –

+1

Hmm, non hai bisogno di altre librerie. Prova a scrivere in ES5, la versione del tuo nodo potrebbe non supportare la notazione della freccia grassa. .then (function (response) {...}) –