2017-01-12 5 views
1

Я делаю запрос jsonp, и я получаю эту ошибку Refused to execute script from 'https://myurl/test.php?callback=%27callback%27' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled., несмотря на то, что запрос возвращает код 200.Отказался от выполнения сценария по запросу jsonp

function callback(response){ 
    alert(response); 
} 

var script = document.createElement("script"); 
//Set the Type. 
script.type = "text/javascript"; 
//Set the source to the URL the JSON Service. 
script.src = "https://myurl/test.php?callback='callback'"; 
//Append the script element to the HEAD section. 
document.getElementsByTagName("head")[0].appendChild(script); 

и это test.php

<?php 
    $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5); 

    echo json_encode($arr); 
?> 
+0

[изменить mime-тип вывода в php] (// stackoverflow.com/questions/152006/change-mime-type-of-output-in-php) – Thomas

+0

и [В чем разница между JSON и JSONP?] (//stackoverflow.com/a/2887218/6567275) – Thomas

+0

Ваш PHP-код не возвращает JSONP .... – epascarello

ответ

0

В PHP установлен перед эхом

header('Content-Type: application/json'); 

И ваш PHP не имеет никакого обратного вызова (вы не возвращаетесь JSONP). Вы хотите, чтобы это выглядело как-то ..

echo $_GET['callback'].'('.json_encode($arr).')'; 

Отредактировано

я пропустил абсолютный очевидно. JSONP предназначен для вызовов AJAX на разных площадках. Вы используете его как скрипт.

Это очень неудобный способ загрузки данных. Обычный способ - загрузить данные через вызов AJAX внутри скрипта, а не загружать переменные глобально.

Если вы действительно хотите пойти с вашим дизайном, сохраните тег application/json, но вернитесь к исходному echo json_encode($arr); Вы также можете отказаться от вызова callback = 'callback' - он ничего не делает.

+0

Теперь говорит, что обратный вызов не является функцией –

+0

@af_inb Я обновил ответ. –

+0

с 'echo json_encode ($ arr);' Iget this error 'Uncaught SyntaxError: Неожиданный токен:' on '{" a ": 1," b ": 2," c ": 3," d ": 4, e ": 5}' –

0

необходимо указать тип вывода. Попробуйте добавить

header('Content-Type: application/json'); 

перед выводом массива в test.php

, а затем вам нужно обернуть весь кодированный вывод имени обратного вызова так JS на стороне клиента может работать с ним:

$callbackName = filter_input(INPUT_GET, 'callback'); 
echo $callbackName . '(' . json_encode($arr) . ')';