HTTP-запрос узла для API Restful, которые возвращают JSONP - PullRequest
10 голосов
/ 30 января 2012

Я пытаюсь выполнять вызовы на стороне сервера для API-интерфейсов restful, используя node.js. Возвраты с JSONP (контейнер JSON внутри функции JS) возвращают ошибки, которые, по-видимому, лежат в основе узла http.get (options, callback) API. Может ли узел или любой модуль возвратить объект JSON из возврата JSONP?

Пример запроса 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/

Ответы [ 2 ]

8 голосов
/ 05 марта 2015

Выполнить обратный вызов с vm

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

Предыдущий ответ предлагает убрать функцию обратного вызова. К сожалению, это несовместимо со многими ответами jsonp, поскольку содержимое функции обычно является объектами, а не чистым JSON. Функция JSON.parse () умрет за что-то вроде следующего:

callback({key:"value"});

Хотя приведенный выше является допустимым объектом, он не является допустимым JSON.

Следующая команда выполнит обратный вызов и вернет объект:

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

При создании контекста измените callback на имя функции обратного вызова, которая возвращается в ответе jsonp.

6 голосов
/ 05 мая 2013

Я бы написал функцию-обертку, которая проверяет JSON и удаляет функцию из возвращаемой строки, чтобы избежать запуска eval.Затем JSON.parse для строки (теперь минус функцию, поскольку мы ее удалили) для возврата 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);
  }
})
}

Затем используйте его так:

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);
});
...