2016-07-08 4 views
2

Я пытаюсь изучить JSONP. Из моего исследования в Интернете я понял, что он вызывает функцию с обратным вызовом. От этого все остальное (способ обработки данных/формат данных) аналогичен JSON?Обратный вызов JSONP возвращает ошибку

Я просто играю с JSONP, как показано ниже. Но это возвращение ошибки, пожалуйста, объясните подробно об этом, пожалуйста ..

script.js

function test(){ 
jQuery.ajax({ 
    url: "/plugins/system/chat/jsonstr.php", 
    dataType: "jsonp", 
    jsonpCallback: "logResults" 
}); 

jsonstr.php

logResults(){ 
    $arr = '[{ 
     "title": "keren", 
     "picture": "http://something.png", 
     "id":1 
    }, { 
     "title": "diana", 
     "picture": "/plugins/system/conversekit/conversekit/images/avatar.png", 
     "id": 2 
    }]'; 
    echo $arr; 
} 

Я ожидаю, что этот призыв вернуть JSON объект так, чтобы я может манипулировать им в успешной функции теста. Но ошибка, как показано ниже брошено:

<br /> 
<b>Parse error</b>: syntax error, unexpected '{' in <b>C:\projects\easysocial.com\plugins\system\conversekit 
\jsonstr.php</b> on line <b>14</b><br /> 

URL-адрес в консоли, как это:

GET http://mysite.localhost.com/plugins/system/chat/jsonstr.php?callback=logResults 
+0

'jsonpCallback: "logResults"' ==> 'jsonpCallback: logResults' – Tushar

+0

' Эхо $ обр; '==>' эхо json_encode ($ обр), ' – Tushar

+0

@Tushar, jsonpCallback: logResults, говорит«ReferenceError: logResults не определено « – 112233

ответ

2

logResults() является JavaScript обратного вызова, а не PHP функции. jsonstr.php должен возвращать только действительный JSON.

Так jsonstr.php должен выглядеть так

<?php 

$arr = [ 
      [ 
       'title' => "keren", 
       'picture' => "http://something.png", 
       'id' => 1, 
      ], 
      [ 
       'title' => "diana", 
       'picture' => "/plugins/system/conversekit/conversekit/images/avatar.png", 
       'id' => 2, 
      ], 
     ]; 

echo(json_encode($arr)); 

И script.js

function logResults() { 
    console.log('ajax done'); 
} 

function test(){ 
    jQuery.ajax({ 
     url: "/plugins/system/chat/jsonstr.php", 
     dataType: "jsonp", 
     jsonpCallback: logResults 
    }); 
} 
+0

Большое вам спасибо – 112233

+0

Если я хочу использовать jsonstr.php в качестве API, я определю несколько функций. Так как я могу назвать конкретную функцию через jsonp? – 112233

+1

Вы можете использовать параметры GET, например '/plugins/system/chat/jsonstr.php? Method = get_users'. Вы можете добавить любую логику к вашему PHP, но в конце возвратите JSON. – exabyssus

1

два вопроса:

  1. Ваш серверный скрипт ничего не возвращает , так как панель Net в вашем браузере должна проявляться.

  2. JSONP - всего лишь грязный трюк, чтобы избежать проблем с межсайтовым разрешением в AJAX, а не для того, чтобы заставить PHP-код взаимодействовать с JavaScript (что-то, что невозможно). Поэтому, когда вы говорите: «Я хочу, чтобы функция обратного вызова называлась logResults« вы имеете в виду a JavaScript функция.

Если вы хотите использовать JSONP вам нужно:

  1. сделать сервер на самом деле вернуть JSONP (даже не в формате JSON):

    $callback = filter_INPUT(INPUT_GET, 'callback'); 
    // ... 
    echo sprintf('%s(%s);', $callback, $json); 
    
  2. Определите функцию JavaScript для обработки возвращенные данные:

    function logResults (data) { 
        alert(data[0].title); 
    } 
    

Таким образом, вы в основном получаете динамически генерируемый хороший старый <script> тег, который загружает простой скрипт:

logResults([{ 
     "title": "keren", 
     "picture": "http://something.png", 
     "id":1 
    }, { 
     "title": "diana", 
     "picture": "/plugins/system/conversekit/conversekit/images/avatar.png", 
     "id": 2 
    }]); 

Но так как вы делаете вызов AJAX в вашем собственном домене:

url: "/plugins/system/chat/jsonstr.php", 
    ^^ 
     No "http://example.com/` prefix pointing to a third-party site 

. .. вы не нужно JSONP вообще: простой JSON будет достаточно.

+0

Alvaro вы правы, мой серверный скрипт ничего не возвращает, поэтому функция logResults не выполняет то, что она должна делать. Я вижу ответ в консоли. Я попробовал ваш ответ t вызвать обратный вызов, но безрезультатно – 112233

+0

@Keren Я полностью обновил свой вопрос после (надеюсь) понимания, откуда возникла путаница. –

+0

О ... Я просто делал очистку, потому что предположил, что вы ее разобрали (вы отметили ответ как принятый). ** Ошибка анализа ** означает, что ваш PHP-код не имеет допустимого синтаксиса и даже не может работать. –