JSONP je metoda pro odesílání dat JSON bez obav z problémů mezi doménami.
JSONP nepoužívá objekt XMLHttpRequest
.
JSONP místo toho používá značku <script>
.
JSONP je zkratka pro JSON with Padding.
Vyžádání souboru z jiné domény může způsobit problémy kvůli zásadám mezi doménami.
Vyžádání externího scriptu z jiné domény tento problém nemá.
JSONP využívá této výhody a požaduje soubory pomocí značky skriptu místo objektu XMLHttpRequest
.
<script src="demo_jsonp.php">
Soubor na serveru zabalí výsledek do a volání funkce:
<?php
$myJSON = '{ "name":"John", "age":30, "city":"New York" }';
echo "myFunc(".$myJSON.");";
?>
Výsledek vrátí volání funkce s názvem „myFunc“ s daty JSON as parametr.
Ujistěte se, že funkce na klientovi existuje.
Funkce s názvem "myFunc" je umístěna na klientovi a je připravena ke zpracování Data JSON:
function myFunc(myObj)
{
document.getElementById("demo").innerHTML =
myObj.name;
}
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>Request JSON using the script tag</h2>
<p>The PHP file returns a call to a function that will handle the JSON data.</p>
<p id="demo"></p>
<script>
function myFunc(myObj) {
document.getElementById("demo").innerHTML = myObj.name;
}
</script>
<script src="demo_jsonp.php"></script>
</body>
</html>
Výše uvedený příklad spustí funkci "myFunc", když je stránka načítání, podle toho, kam jste umístili značku skriptu, což není příliš uspokojivé.
Značka skriptu by měla být vytvořena pouze v případě potřeby:
Po kliknutí na tlačítko vytvořte a vložte značku <script>:
function clickButton() {
let s = document.createElement("script");
s.src = "demo_jsonp.php";
document.body.appendChild(s);
}
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>Click the Button.</h2>
<p>A script tag with a src attribute is created and placed in the document.</p>
<p>The PHP file returns a call to a function with the JSON object as a parameter.</p>
<button onclick="clickButton()">Click me!</button>
<p id="demo"></p>
<script>
function clickButton() {
let s = document.createElement("script");
s.src = "demo_jsonp.php";
document.body.appendChild(s);
}
function myFunc(myObj) {
document.getElementById("demo").innerHTML = myObj.name;
}
</script>
</body>
</html>
Výše uvedené příklady jsou stále velmi statické.
Udělejte příklad dynamickým odesláním JSON do souboru php a nechte soubor php vrátit objekt JSON založený na informace, které dostane.
<?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).")";
?>
Převeďte požadavek na objekt pomocí funkce PHP json_decode().
Vstupte do databáze a vyplňte pole požadovanými údaji.
Přidejte pole k objektu.
Převeďte pole do JSON pomocí funkce json_encode().
Obalte "myFunc()" kolem vráceného objektu.
Funkce "myFunc" bude volána ze souboru 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;
}
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<p>A script tag with a src attribute is created and placed in the document.</p>
<p>The PHP file returns a call to a function with an object as a parameter.</p>
<p id="demo"></p>
<p>Try changing the table property from "customers" to "products".</p>
<script>
const obj = { table: "customers", 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;
}
</script>
</body>
</html>
Když nemáte kontrolu nad souborem serveru, jak získáte soubor serveru zavolat správnou funkci?
Někdy soubor serveru nabízí funkci zpětného volání jako parametr:
Soubor php zavolá funkci, kterou předáte jako parametr zpětného volání:
let s = document.createElement("script");
s.src = "jsonp_demo_db.php?callback=myDisplayFunction";
document.body.appendChild(s);
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>Request With a Callback Function</h2>
<p>The PHP file returns a call to the function you send as a callback.</p>
<p id="demo"></p>
<script>
let s = document.createElement("script");
s.src = "demo_jsonp2.php?callback=myDisplayFunction";
document.body.appendChild(s);
function myDisplayFunction(myObj) {
document.getElementById("demo").innerHTML = myObj.name;
}
</script>
</body>
</html>