JSONP
JSONP это метод отправки данных JSON, не беспокоясь о междоменных проблемах.
JSONP не использует объект XMLHttpRequest
.
JSONP вместо этого использует тег <script>
.
JSONP Введение
JSONP означает JSON с Padding (т.е. с дополнением).
Запрос файла из другого домена может вызвать проблемы из-за междоменной политики.
Запрос внешнего скрипта из другого домена не вызывает этой проблемы.
JSONP использует это преимущество и запрашивает файлы с помощью тега script
вместо объекта XMLHttpRequest
.
<script src="demo_jsonp.php">
Файл сервера
Файл на сервере заключает результат в вызов функции:
Пример
<?php
$myJSON = '{ "name":"John", "age":30, "city":"New York" }';
echo "myFunc(".$myJSON.");";
?>
Показать PHP файл »
Результат возвращает вызов функции с именем "myFunc" с данными JSON в качестве параметра.
Убедитесь, что функция существует на клиенте.
Функция JavaScript
Функция с именем "myFunc" находится на стороне клиента и готова к обработке данных JSON:
Пример
function myFunc(myObj) {
document.getElementById("demo").innerHTML = myObj.name;
}
Попробуйте сами »
Создание тега динамического скрипта
В приведенном выше примере выполняется функция "myFunc" функция при загрузке страницы в зависимости от того, куда вы поместили тег <script>
, что не совсем правильно.
Тег <script>
следует создавать только при необходимости:
Пример
Создайте и вставьте тег <script>
при нажатии кнопки:
function clickButton() {
let s = document.createElement("script");
s.src = "demo_jsonp.php";
document.body.appendChild(s);
}
Попробуйте сами »
Динамический результат JSONP
Приведенные выше примеры всё ещё очень статичны.
Сделайте пример динамическим, отправив JSON в php-файл, и пусть php-файл возвращает объект JSON на основе полученной информации.
PHP файл
<?php
header("Content-Type: application/json; charset=UTF-8");
$obj = json_decode($_GET["x"], false);
$conn = new mysqli("myServer", "myUser", "myPassword", "Northwind");
$result = $conn->query("SELECT name FROM ".$obj->$table." LIMIT ".$obj->$limit);
$outp = array();
$outp = $result->fetch_all(MYSQLI_ASSOC);
echo "myFunc(".json_encode($outp).")";
?>
Объяснение PHP файла:
- Преобразовать запрос в объект, используя функцию PHP json_decode().
- Доступ к базе данных и заполнение массива запрошенными данными.
- Добавить массив к объекту.
- Преобразовать массив в формат JSON с помощью функции json_encode().
- Обернуть "myFunc()" вокруг возвращаемого объекта.
JavaScript Пример
Функция "myFunc" будет вызываться из файла php:
const obj = { table: "products", limit: 10 };
let s = document.createElement("script");
s.src = "jsonp_demo_db.php?x=" + JSON.stringify(obj);
document.body.appendChild(s);
function myFunc(myObj) {
let txt = "";
for (let x in myObj)
{
txt += myObj[x].name + "<br>";
}
document.getElementById("demo").innerHTML = txt;
}
Попробуйте сами »
Функция обратного вызова
Если у вас нет контроля над файлом сервера, как заставить файл сервера вызывать правильную функцию?
Иногда файл сервера предлагает функцию обратного вызова в качестве параметра:
Пример
Файл php будет вызывать функцию, которую вы передаете в качестве параметра обратного вызова:
let s = document.createElement("script");
s.src = "jsonp_demo_db.php?callback=myDisplayFunction";
document.body.appendChild(s);
Попробуйте сами »