Есть ли функция JSONP.parse() в собственном Javascript?

Я получаю ответ xhr объекта JSONP, похожий на

JSONP({Objects})

Это вызовет ошибку, если я сделаю JSON.parse('JSONP({Objects})') (Unexpected token j in JSON at position 0), есть ли функция JSONP.parse(), которая автоматически удалит *() из ответа JSONP?

Почему я должен это делать?

Потому что этот ответ JSONP требует POST-запроса, который должен затруднить его использование другими людьми.

P.S., заполнение обратного вызова JSONP является динамичным и непредсказуемым.


person Aero Wang    schedule 10.06.2017    source источник
comment
Вы, очевидно, не знаете, как работает JSONP — см. stackoverflow.com/questions/3839966/   -  person Jaromanda X    schedule 10.06.2017
comment
Вы уверены, что API не поддерживает и простой JSON? Это было бы действительно странно.   -  person Bergi    schedule 10.06.2017
comment
@Bergi, я не думаю, что это должно быть общедоступным API.   -  person Aero Wang    schedule 10.06.2017
comment
@AeroWang Каким бы ни был API, я уверен, что они не предоставляют формат JSONP для публики и ограничивают формат JSON. В любом случае, просто спросите провайдера о JSON API!   -  person Bergi    schedule 10.06.2017


Ответы (1)


Теоретически вы все равно можете добавить jsonp в документ:

var jsonp = {};
function getList(callback){
  var xhrlist = new XMLHttpRequest();
  xhrlist.addEventListener('load',function(){
    if (xhrlist.status == 200) {
      callback(null, xhrlist.responseText);
    } else {
      console.log(xhrlist.responseText);
      callback('error');
    }
  });
  xhrlist.open('POST', 'http://example.com/');
  xhrlist.send('request=list');
}
getList((err, data)=>{
  if (err) {
    alert(err);
  } else {
    alert('success!');
    var script = document.createElement('script');
    script.innerHTML = data;
    document.getElementsByTagName('head')[0].appendChild(script);
  }
});
function JSONP(response) {
  jsonp = response;
}

Теперь здесь есть недостаток, function JSONP(response) должен иметь то же имя, что и ваш обратный вызов JSONP. Так что это допустимо только в том случае, если обратный вызов остается прежним, и вы уже знаете, что это такое.

Конечно, если вам нужно разбить JSONP, вы можете попробовать это:

data = data.substring(data.indexOf('(') + 1);
data = data.substring(0, data.length - 1);

В этом случае вам не нужно знать обратный вызов.

person James Wayne    schedule 10.06.2017
comment
Круто, что произойдет, если обратный вызов будет динамическим? - person Aero Wang; 10.06.2017