2012-01-30 11 views
10

Próbuję wykonać wywołania po stronie serwera do restful API za pomocą node.js. Zwroty za pomocą JSONP (kontener JSON wewnątrz funkcji JS) zwracają błędy, które wydają się być sercem interfejsu API http.get (options, callback). Czy węzeł lub dowolny moduł zwraca obiekt JSON ze zwrotu JSONP?Węzeł żądania HTTP dla restful api, który zwraca JSONP

Przykład JSONP prośba: 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

Czy możesz podać kod? Zauważyłem, że w adresie URL nie ma odwołania do oddzwonienia. Zwykle wygląda to tak: & callback = foo lub & jsonp = bar. Wygląda na to, że LinkedIn odpowiada na oddzwonienie. Następnie możesz użyć url.parse, aby znaleźć ten parametr i odpowiednio postępować. – booyaa

+0

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

+0

Parametr wywołania zwrotnego (& callback = functionName) z linkedin pozwala zmienić funkcję opakowania na dowolnie wybraną nazwę (ale nie można jej usunąć razem) .Jeśli mógłbym uzyskać poprawną odpowiedź (JSON lub JSONP) z HTTP i modułu lub żądanie HTTP API z JS pod Węzeł Byłbym szczęśliwym człowiekiem – user690740

Odpowiedz

6

Chciałbym napisać funkcję otoki który sprawdza JSON i paski funkcja off zwrócony ciąg po prostu unikać używania eval. Następnie JSON.parse na ciągu (teraz minus funkcja, ponieważ usunęliśmy go), aby zwrócić 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); 
    } 
}) 
} 

następnie używać go tak:

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

Wykonaj zwrotnego z vm

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

poprzedniej odpowiedzi sugeruje Striping funkcji oddzwaniania. Niestety nie jest to zgodne z wieloma odpowiedziami jsonp, ponieważ zawartość tej funkcji jest zwykle obiektem, a nie czystym JSON. Funkcja JSON.parse() będzie umierać za coś jak następuje:

callback({key:"value"}); 

Chociaż powyższy jest ważny obiekt, nie jest ważne JSON.

Poniższa wykona zwrotnego i powrotu obiektu:

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

Tworząc zmianę kontekstu callback do nazwy funkcji wywołania zwrotnego, który jest zwracany w odpowiedzi jsonp.

+2

briliant. działa doskonale. –