JSONP er en metode til at sende JSON-data uden at bekymre dig om problemer på tværs af domæner.
JSONP bruger ikke XMLHttpRequest
-objektet.
JSONP bruger </script>
-tagget i stedet.
JSONP står for JSON med polstring.
Anmodning om en fil fra et andet domæne kan forårsage problemer på grund af politikken på tværs af domæner.
Det har ikke dette problem at anmode om et eksternt script fra et andet domæne.
JSONP bruger denne fordel og anmoder om filer ved hjælp af script-tagget i stedet for XMLHttpRequest
-objektet.
<script src="demo_jsonp.php">
Filen på serveren pakker resultatet ind i en funktionskald:
<?php
$myJSON = '{ "name":"John", "age":30, "city":"New York" }';
echo "myFunc(".$myJSON.");";
?>
Resultatet returnerer et kald til en funktion ved navn "myFunc" med JSON-dataene som en parameter.
Sørg for, at funktionen findes på klienten.
Funktionen med navnet "myFunc" er placeret på klienten og klar til at håndtere JSON data:
function myFunc(myObj)
{
document.getElementById("demo").innerHTML =
myObj.name;
}
Prøv det selv →
<!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>
Eksemplet ovenfor vil udføre "myFunc"-funktionen, når siden er loading, baseret på hvor du har sat script-tagget, hvilket ikke er særlig tilfredsstillende.
Script-tagget bør kun oprettes, når det er nødvendigt:
Opret og indsæt <script>-tagget, når der klikkes på en knap:
function clickButton() {
let s = document.createElement("script");
s.src = "demo_jsonp.php";
document.body.appendChild(s);
}
Prøv det selv →
<!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>
Eksemplerne ovenfor er stadig meget statiske.
Gør eksemplet dynamisk ved at sende JSON til php-filen, og lad php-filen returnere et JSON-objekt baseret på den information, den får.
<?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).")";
?>
Konverter anmodningen til et objekt ved hjælp af PHP-funktionen json_decode().
Få adgang til databasen, og fyld et array med de ønskede data.
Tilføj arrayet til et objekt.
Konverter arrayet til JSON vha funktionen json_encode().
Pak "myFunc()" rundt om returobjektet.
Funktionen "myFunc" kaldes fra php-filen:
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;
}
Prøv det selv →
<!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>
Når du ikke har kontrol over serverfilen, hvordan får du serverfilen at kalde den rigtige funktion?
Nogle gange tilbyder serverfilen en tilbagekaldsfunktion som en parameter:
php-filen kalder den funktion, du sender som en tilbagekaldsparameter:
let s = document.createElement("script");
s.src = "jsonp_demo_db.php?callback=myDisplayFunction";
document.body.appendChild(s);
Prøv det selv →
<!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>