2015-03-24 2 views
1

Почему это возвращает синтаксическую ошибку?jquery + jsonp возвращает синтаксическую ошибку, даже если ответ json

http://jsfiddle.net/syng17fv/

jquery.jsonp https://github.com/jaubourg/jquery-jsonp

ответ http://cvrapi.dk/api?search=test&country=dk

$.jsonp({ 
    url : 'http://cvrapi.dk/api?search=test&country=dk', 
    success : function(json){ 
     console.log('success') 
    }, 
    error : function(){ 
     console.log('err') 
    } 
}); 

обновление

Это работает

$.ajax({ 
     type : 'GET', 
     dataType : 'jsonp', 
     url : '//cvrapi.dk/api?search=test&country=dk', 
     success : function(res){ 

     } 
    }); 
+0

[Вы проверили Google?] (Http://stackoverflow.com/questions/24311023/unexpected-token-colon-json-after-jquery- ajaxget) –

+0

У вас есть решение? – clarkk

+0

да он это делает, прямо здесь: http://stackoverflow.com/questions/24311023/unexpected-token-colon-json-after-jquery-ajaxget – rlemon

ответ

1

После анализа плагина url = url.replace(/=\?(&|$)/ , "=" + successCallbackName + "$1"); работает не так хорошо, как make the jsonp callback, поэтому добавьте некоторые функции, чтобы заставить его работать, или попробуйте изменить регулярное выражение, чтобы добавить обратный вызов к URL-адресу.

Попробуйте заменить url = url.replace(/=\?(&|$)/ , "=" + successCallbackName + "$1");in the plugin на нижеследующий код.

function addCallback(paramName, paramValue, url) { 

    if (url.indexOf(paramName + "=") >= 0) { 
     var prefix = url.substring(0, url.indexOf(paramName)); 
     var suffix = url.substring(url.indexOf(paramName)); 
     suffix = suffix.substring(suffix.indexOf("=") + 1); 
     suffix = (suffix.indexOf("&") >= 0) ? suffix.substring(suffix.indexOf("&")) : ""; 
     url = prefix + paramName + "=" + paramValue + suffix; 
    } else { 
     if (url.indexOf("?") < 0) 
     url += "?" + paramName + "=" + paramValue; 
     else 
     url += "&" + paramName + "=" + paramValue; 
    } 
     return url; 

} 

url = addCallback('callback', successCallbackName, url); 

Updated fiddle

4

Вам нужно добавить параметр обратного вызова. Я объясню, почему именно ниже.

Вызов JSONP не работает без обратного вызова. Данные загружаются в тег сценария, и если код не находится в форме вызова метода, результатом будет только объект, который был бы отброшен, и метод обратного вызова успеха никогда не будет вызван.

Почему [не используется обратный вызов] возвращает синтаксическую ошибку?

Это как ваш Аякса ответ по существу выглядит без обратного вызова (например http://cvrapi.dk/api?search=test&country=dk):

<script> 
{"vat":11618405,"name":"TESTRUP ... (snip) 
</script> 

Конечно, есть ошибка синтаксиса в этом JavaScript! :)

Вот ответ Аякса с обратного вызова (например, http://cvrapi.dk/api?search=test&country=dk&callback=callbackFunc):

<script> 
callbackFunc({"vat":11618405,"name":"TESTR ... (snip) 
</script> 

Теперь, действительный JavaScript. $.jsonp с вызовом callbackFunc() в этом примере, и все правильно с миром.


Основные элементы JSONP, или "JSON с дополнением", как таковые:

  1. обратного вызова функция, определенная на вашем сайте.
  2. Запрос на удаленный API с помощью тега
    • Включает специальные параметры, обеспечивающих имя функции обратного вызова
  3. Ответ:
    • Есть только Javascript
    • , который состоит из :
      1. Вызов функции, имя которого вы указали в запросе
      2. Аргумент являясь JSON данные, представляющие интерес
    • получает выполняется немедленно, как если бы это были вызваны из собственного домена

Это обратного вызова расположение между вами и сервер, в сочетании с , избегая ограничений одного и того же происхождения, на самом деле весь трюк для JSONP

REF: So how does JSONP really work? и Wikipedia: JSONP


Изменить код JSon как это. Работает как шарм. Обратите внимание, что добавлен параметр «обратный вызов». JSONP ожидает этого. Вот отредактированный JSFiddle: http://jsfiddle.net/Drakes/syng17fv/2/

REF: https://github.com/jaubourg/jquery-jsonp/blob/master/doc/TipsAndTricks.md

$.jsonp({ 
    url : '//cvrapi.dk/api?search=test&country=dk&callback=?', 
    success : function(json){ 
     console.log('success') 
    }, 
    error : function(){ 
     console.log('err') 
    } 
}); 
+0

Привет @clarkk, действительно ли это объяснение действительно решило вашу проблему? Надеюсь, это удовлетворит ваш вопрос, и если да, не могли бы вы любезно принять этот ответ? – Drakes

+0

Код на вашей скрипке http://jsfiddle.net/Drakes/syng17fv/2/ возвращает 'Refused to load the script 'http://cvrapi.dk/api?search=test&country=dk&callback=_jqjsp&_1488820133245=', потому что он нарушает следующую директиву политики безопасности содержимого: «script-src» self »https: // * 'небезопасно-встроенный' 'небезопасный-eval'" 'Это в среде shopify, в которой у меня нет контроля. –

1

Кажется callback вариант не работает. Просто добавьте параметр обратного вызова к URL со значением по умолчанию (_jqjsp)

url : '//cvrapi.dk/api?search=test&country=dk&callback=_jqjsp', 
+0

Я бил вас на 2 минуты! Но у вас тоже острый глаз – Drakes

+0

Обратный звонок работает. Проверьте мой обновленный JSFiddle, который поставляется OP – Drakes

Смежные вопросы