JSONP haqida
JSONP — bu domenlararo (cross-domain) muammolardan xavotir olmasdan JSON ma'lumotlarini yuborish usuli. JSONP XMLHttpRequest obyektidan foydalanmaydi. Buning o'rniga u <script> tegidan foydalanadi.
JSONP-ga kirish
JSONP "JSON with Padding" (to'ldirilgan JSON) degan nomning qisqartmasidir.
Boshqa domendan fayl so'rash domenlararo siyosat (cross-domain policy) tufayli muammolarga olib kelishi mumkin. Biroq, boshqa domendan tashqi skriptni so'rashda bunday muammo yo'q. JSONP mana shu afzallikdan foydalanadi va XMLHttpRequest obyekti o'rniga skript tegi yordamida fayllarni so'raydi.
<script src="demo_jsonp.php"></script>Server fayli
Serverdagi fayl natijani funksiya chaqiruvi ichiga o'raydi:
Misol (demo_jsonp.php)
<?php
$myJSON = '{ "name":"John", "age":30, "city":"New York" }';
echo "myFunc(".$myJSON.");";
?>Natija "myFunc" nomli funksiyaga JSON ma'lumotlarini parametr sifatida yuboradigan chaqiruvni qaytaradi. Bunda ushbu funksiya mijoz (client) tomonida mavjud bo'lishi shart.
JavaScript funksiyasi
"myFunc" deb nomlangan funksiya mijoz tomonida joylashgan va JSON ma'lumotlarini qabul qilishga tayyor:
Misol
function myFunc(myObj) {
document.getElementById('demo').innerHTML = myObj.name
}Dinamik skript tegini yaratish
Yuqoridagi misol sahifa yuklanayotganda, skript tegi qayerda joylashganiga qarab "myFunc" funksiyasini bajaradi. Bu har doim ham qulay emas. Skript tegi faqat kerak bo'lganda yaratilishi kerak:
Misol
Tugma bosilganda <script> tegini yaratish va joylashtirish:
function clickButton() {
let s = document.createElement('script')
s.src = 'demo_jsonp.php'
document.body.appendChild(s)
}Dinamik JSONP natijasi
Yuqoridagi misollar hali ham juda statik. Misolni dinamik qilish uchun PHP fayliga ma'lumot yuboring va PHP fayli olingan ma'lumotlar asosida JSON obyektini qaytarsin.
PHP fayli
<?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).")";
?>JavaScript misoli
"myFunc" funksiyasi PHP faylidan chaqiriladi:
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
}Callback funksiyasi
Agar sizda server fayli ustidan nazorat bo'lmasa, server fayli to'g'ri funksiyani chaqirishiga qanday erishish mumkin? Ba'zan server fayli parametr sifatida qayta aloqa (callback) funksiyasini taklif qiladi:
Misol
PHP fayli siz callback parametri sifatida yuborgan funksiyani chaqiradi:
let s = document.createElement('script')
s.src = 'jsonp_demo_db.php?callback=myDisplayFunction'
document.body.appendChild(s)