2012-01-30 32 views
10

Sto tentando di effettuare chiamate lato server a API riposanti utilizzando node.js. Restituisce con JSONP (contenitore JSON all'interno di una funzione JS) restituisce errori che sembrano essere al centro del nodo http.get (opzioni, callback) API. Can node o qualsiasi modulo restituiscono l'oggetto JSON da un ritorno JSONP?Richiesta HTTP di nodo per Restful API che restituisce JSONP

richiesta

Esempio JSONP: http://www.linkedin.com/countserv/count/share?url=http://techcrunch.com/2012/01/29/turning-two-founderscard-pulls-back-the-curtain-on-its-membership-community-for-entrepreneurs/

+0

Riesci a capire il codice? Ho notato che non vi è alcun riferimento alla richiamata nell'URL. Di solito questo è come & callback = foo o & jsonp = bar. Sembra che LinkedIn risponda al callback. Puoi quindi utilizzare url.parse per trovare quel parametro e agire di conseguenza. – booyaa

+0

request = require ('request'); richiesta ({uri: 'http://graph.facebook.com/?ids=http://appsumo.com'}, funzione (err, responser, body) {myObject = eval ('(' + body + ' }; – user690740

+0

Il parametro di callback (& ​​callback = functionName) con linkedin consente di modificare la funzione wrapper in qualsiasi nome desiderato (ma non di rimuoverlo tutti insieme) .Se potrei ottenere una risposta valida (JSON o JSONP) da e modulo o richiesta HTTP API con JS in nodo. Sarei un uomo felice. – user690740

risposta

6

mi piacerebbe scrivere una funzione wrapper che verifica la presenza di JSON e strisce la funzione al largo della stringa restituita solo per evitare l'esecuzione di eval. Quindi JSON.parse sulla stringa (ora meno la funzione da quando l'abbiamo rimosso) per restituire json.

var request = require('request'); 
var getJsonFromJsonP = function (url, callback) { 
request(url, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
    var jsonpData = body; 
    var json; 
    //if you don't know for sure that you are getting jsonp, then i'd do something like this 
    try 
    { 
     json = JSON.parse(jsonpData); 
    } 
    catch(e) 
    { 
     var startPos = jsonpData.indexOf('({'); 
     var endPos = jsonpData.indexOf('})'); 
     var jsonString = jsonpData.substring(startPos+1, endPos+1); 
     json = JSON.parse(jsonString); 
    } 
    callback(null, json); 
    } else { 
    callback(error); 
    } 
}) 
} 

Quindi utilizzare in questo modo:

getJsonFromJsonP('http://www.linkedin.com/countserv/count/share?url=http://techcrunch.com/2012/01/29/turning-two-founderscard-pulls-back-the-curtain-on-its-membership-community-for-entrepreneurs/', function (err, data) { 
    console.log('data count', data.count); 
}); 
8

Eseguire il callback con vm

JavaScript code can be compiled and run immediately or compiled, saved, and run later 

Una risposta precedente suggerisce striping la funzione di richiamata. Sfortunatamente, questo non è compatibile con molte risposte jsonp poiché i contenuti della funzione sono di solito oggetti e non JSON puro. La funzione JSON.parse() sarà morire per qualcosa di simile al seguente:

callback({key:"value"}); 

Mentre il sopra è un oggetto valido, non è JSON valido.

Di seguito eseguirà la richiamata e restituire l'oggetto:

jsonpSandbox = vm.createContext({callback: function(r){return r;}}); 
myObject = vm.runInContext(jsonpData,jsonpSandbox); 

Quando si crea la modifica di contesto callback al nome della funzione callback che viene restituito nella risposta jsonp.

+2

brillante funziona perfettamente. –

Problemi correlati