L'exemple de cet article décrit la solution inter-domaines ajax jsonp sous PHP. Partagez-le avec tout le monde pour référence, les détails sont les suivants :
Tout d'abord, laissez-moi vous expliquer la différence entre json et jsonp ?
Json est une méthode d'échange de données basée sur du texte, ou un format pour décrire des données.
Recommandations d'apprentissage associées : programmation php (vidéo)
var person = { "name": "test", "age": "25", "sex": "男" }; var data = [1, 2, 3, 4, 5];
Et jsonp est un protocole non officiel d'interaction de données inter-domaines qui permet à l'utilisateur de passer un paramètre de rappel au serveur, puis lorsque le serveur renvoie des données, il utilisera ce paramètre de rappel comme nom de fonction pour envelopper les données json, afin que le client puisse personnaliser sa propre fonction pour traiter automatiquement les données renvoyées.
Par exemple, j'ai cité un b.js de b.com sur le site a.com, mais une telle référence inter-domaines ne provoquera pas d'erreur, ce qui signifie que lors de l'appel du fichier js, il ne pas être affecté par le cross-domain.
<script type="text/javascript" src="http://www.b.com/b.js"></script>
Ensuite, nous ajoutons le code suivant dans b.js pour voir s'il peut être exécuté
alert("I from b");
Assurez-vous qu'il peut être exécuté.
Donc, si nous créons une fonction js sur a.com et l'appelons dans b.js sous b.com, est-ce faisable ?
L'index.html sous a.com est le suivant :
Le b.js sous b.com est le suivant :
a("from b");
Ce qui précède peut également être exécuté , nous pouvons voir que les données dans b.js sont effectivement transmises pour fonctionner correctement.
Le problème revient. Le nom de la fonction créée dans a.com doit être le même que le nom de la fonction appelée dans b.js. Alors, comment pouvons-nous faire connaître ce nom de fonction au serveur b.com ? ne se faire que via la barre d'adresse. Passé, ajoutez un nom de rappel = fonction à passer. Bien sûr, le rappel du nom peut être modifié, mais comme tout le monde le nomme ainsi, il s'agit d'une convention.
L'index.html sous a.com est le suivant :
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script type="text/javascript"> function a(data) { alert("uid :" + data.uid + "name :" + data.name); } </script> <!-- 注意这里把b.js改成b.php了 --> <script type="text/javascript" src="http://www.b.com/b.php?callback=a"></script> </body> </html>
Le b.php sous b.com est le suivant :
<?php $callback = !empty($_GET['callback']) ? trim($_GET['callback']) : ''; if(!empty($callback)) { $data = json_encode(array( 'uid' => 1, 'name' => '测试', )); echo "{$callback}({$data});"; }
Ce qui précède peut également être exécuté , connaissant le nom de la fonction de rappel, le serveur b.com traite les données puis les génère par concaténation de chaînes.
jquery prend déjà en charge jsonp. Le fichier index.html sous a.com est le suivant :
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <p class="info"></p> <script type="text/javascript" src="http://www.b.com/jquery.js"></script> <script type="text/javascript"> $.ajax({ dataType: "jsonp", url: "http://www.b.com/b.php", jsonp: "callback", success: function(data) { $(".info").text("uid:" + data.uid + " name:" + data.name); } }); </script> </body> </html>
Le tableau des restrictions de politique inter-domaines est le suivant :
URL | Description | Autoriser la communication |
http:// www.a.com/a.js http://www.a.com/b.js |
Sous le même nom de domaine | autorisé |
http://www.a .com /lab/a.js http://www.a.com/script/b.js |
Différents dossiers sous le même nom de domaine | Autoriser |
http:/ /www.a.com:8000/a.js http://www.a.com/b.js |
Même nom de domaine, ports différents | Non autorisé |
http://www .a.com/a.js https://www.a.com/b.js |
Même nom de domaine, protocoles différents | Interdit |
http://www .a.com/a.js http://127.0.0.100/b.js |
Nom de domaine et nom de domaine IP correspondant | Non autorisé |
http://www. a.com/a.js http://script.a.com/b.js |
Même domaine principal, différents sous-domaines | Non autorisé |
http://www .a.com/a.js http://a.com/b.js |
Même nom de domaine, noms de domaine de deuxième niveau différents (comme ci-dessus) | Non autorisé |
http://www.a.com/a.js http://www.b.com/b.js |
Noms de domaine différents | non autorisés |
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!