Maison interface Web js tutoriel Interprétation détaillée des principes JSONP

Interprétation détaillée des principes JSONP

Jun 22, 2018 pm 05:56 PM
jsonp 原理

L'éditeur ci-dessous recommande une analyse basée sur les principes JSONP, qui a une bonne valeur de référence et j'espère qu'elle sera utile à tout le monde. Suivons l'éditeur et jetons un coup d'oeil.

Avant-propos

Le premier projet avec lequel je suis entré en contact depuis que j'ai commencé à travailler est le front- séparation de l'extrémité et du back-end, et le front-end est statique. Le fichier a son propre nom de domaine indépendant et les données sont obtenues via l'interface pour le rendu et d'autres opérations.

Il n'est pas nécessaire d'élaborer sur les méthodes inter-domaines. Il suffit de rechercher et il y en aura beaucoup, mais les méthodes les plus couramment utilisées sont jsonp et CORS. jsonp se concentre sur le front-end, qui peut être considéré comme le front-end. Les compétences de piratage CORS sont plus importantes que le back-end, et le serveur doit être davantage configuré.

Cet article analyse le principe d'implémentation de jsonp.

Principe de base

Le principe de base est facile à expliquer. Il y a certaines balises dans les pages HTML qui ne le sont pas. autorisé à être franchi. Restrictions de domaine, telles que img, script, lien, etc. Si nous mettons les données dont nous avons besoin dans un fichier js, nous pouvons alors dépasser la limitation de même origine du navigateur.

Créer une balise de script

Les éléments de script dynamiques sont mentionnés dans "JavaScript haute performance". L'auteur écrit :

1 Le fichier se trouve dans ceci. élément Commencez le téléchargement une fois ajouté à la page. Le point clé de cette technologie est que chaque fois qu'un téléchargement est lancé, le téléchargement et l'exécution du fichier ne bloquent pas les autres processus sur la page.

2. Lorsque vous utilisez des nœuds de script dynamiques pour télécharger des fichiers, le code renvoyé sera généralement exécuté immédiatement (sauf pour Firefox et Oprea, qui attendront la fin de l'exécution de tous les nœuds de script dynamiques précédents.) Lorsque le script s'exécute. lui-même, ce mécanisme Cela fonctionne bien.

La citation 1 garantit que le thread principal ne sera pas bloqué lors des requêtes JSONP. La citation 2 garantit qu'il n'y aura pas d'erreurs lorsque le code JSONP s'exécutera immédiatement après la fin du chargement.

rappel

Après avoir reçu la requête GET, le serveur doit généralement déterminer s'il existe un paramètre de rappel. Si tel est le cas, il doit le faire. être inclus dans le retour Ajouter un nom de méthode et des parenthèses en dehors des données. Par exemple, si la requête suivante est initiée :

http://www.a.com/getSomething?callback=jsonp0
Copier après la connexion

alors le serveur renverra le contenu suivant :

jsonp0({code:200,data:{}})
Copier après la connexion

Évidemment, puisqu'il s'agit du contenu contenu dans le Script chargé dynamiquement tag, Alors c'est un morceau de code auto-exécutable dans ce code - jsonp0.

Bien sûr, s'il y a exécution, il faut d'abord la créer, sinon une erreur sera signalée. Cette étape de création doit être exécutée avant l'appel.

L'implémentation spécifique est la suivante :

function jsonp (url, successCallback, errorCallback, completeCallback) {

 // 声明对象,需要将函数声明至全局作用域
 window.jsonp0 = function (data) {
  successCallback(data);
  if (completeCallback) completeCallback();
 }
 // 创建script标签,并将url后加上callback参数
 var 
  script = document.createElement('script')
  , url = url + (url.indexOf('?') == -1 ? '?' : '&') + 'callback=jsonp0'
 ;
 script.src = url;
 document.head.parentNode.insertBefore(script, document.head);
 // 等到script加载完毕以后,就会自己执行
}
Copier après la connexion

Ce qui précède complète essentiellement le cœur d'une méthode jsonp. À l'heure actuelle, jsonp0 est une fonction que nous avons déclarée. .Si le service Lorsque le client revient normalement, la fonction jsonp0 sera exécutée et le rappel successCallback à l'intérieur sera également exécuté.

Améliorez-le

Dans les situations réelles, de nombreuses requêtes jsonp sont généralement appelées en même temps,

Donc puisque jsonp0 peut répondre à nos besoins, pourquoi voyons-nous souvent le code de jsonp1, jsonp2, etc. s'accumuler en séquence ?

En effet, les requêtes peuvent être effectuées de manière asynchrone. Lorsque la méthode jsonp est exécutée pour la première fois, window.jsonp0 est la fonction A. À ce moment, le fichier js est chargé. Lorsque js n'est pas chargé, la méthode jsonp est à nouveau appelée. fonction B. Ensuite, une fois les deux js chargés, le deuxième rappel sera exécuté.

Il faut donc faire une distinction dans le nom du rappel, et l'accumulation peut répondre aux besoins.

Modifiez le code :

var jsonpCounter = 0;
function jsonp (url, successCallback, errorCallback, completeCallback) {
 
 var jsId = 'jsonp' + jsonpCounter++;
 
 // 声明对象,需要将函数声明至全局作用域
 window[jsId] = function (data) {
  successCallback(data);
  if (completeCallback) completeCallback();
  clean();
 }
 // 创建script标签,并将url后加上callback参数
 var 
  script = document.createElement('script')
  , url = url + (url.indexOf('?') == -1 ? '?' : '&') + 'callback=' + jsId
 ;
 script.src = url;
 document.head.parentNode.insertBefore(script, document.head);
 // 等到script加载完毕以后,就会自己执行
 
 //在执行完我们这个方法以后,会有很多script标签出现在head之前,我们需要手动的删除掉他们。
 function clean () {
  script.parentNode.removeChild(script);
  window[jsId] = function(){};
 }
}
Copier après la connexion

Après avoir ajouté l'accumulation et le nettoyage, il reste encore un endroit important à gérer, qui est le rappel d'erreur. Normalement, lorsque nous demandons jsonp, nous définirons un délai d'attente. Si ce délai est dépassé, une exception de délai d'attente sera levée.

L'implémentation est la suivante :

var jsonpCounter = 0;
function jsonp (url, successCallback, errorCallback, completeCallback, timeout) {
 // 略去上面写过的代码
 var 
  timeout = timeout || 10000
  , timer
 ;
 if (timeout) {
  timer = setTimeout(function () {
   if (errorCallback) {
    errorCallback(new Error('timeout'));
   }
   clean();
  }, timeout)
 }
 
 function clean () {
  script.parentNode.removeChild(script);
  window[jsId] = function(){};
  if (timer) clearTimeout(timer);
 }
}
Copier après la connexion

De cette façon, toutes les fonctions de jsonp sont essentiellement terminées, et le reste peut nécessiter quelques modifications compatibles pour être considéré comme une méthode jsonp complète.

REFER

《JavaScript haute performance》

Une implémentation jsonp sur npm, JSONP

Le ci-dessus est ce que j'ai compilé pour tout le monde. J'espère que cela sera utile à tout le monde à l'avenir.

Articles connexes :

Comment implémenter la conversion explicite et la conversion implicite en javascript

Comment utiliser l'architecture Redux dans ReactNative

Quels problèmes rencontrez-vous lorsque vous utilisez MathJax dans Angular ?

Utiliser NodeJS pour écrire des exemples de robots

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Analyse de la fonction et du principe de nohup Analyse de la fonction et du principe de nohup Mar 25, 2024 pm 03:24 PM

Analyse du rôle et du principe de nohup Dans les systèmes d'exploitation Unix et de type Unix, nohup est une commande couramment utilisée pour exécuter des commandes en arrière-plan. Même si l'utilisateur quitte la session en cours ou ferme la fenêtre du terminal, la commande peut. continuent toujours à être exécutés. Dans cet article, nous analyserons en détail la fonction et le principe de la commande nohup. 1. Le rôle de nohup : Exécuter des commandes en arrière-plan : Grâce à la commande nohup, nous pouvons laisser les commandes de longue durée continuer à s'exécuter en arrière-plan sans être affectées par la sortie de l'utilisateur de la session du terminal. Cela doit être exécuté

Discussion approfondie sur les principes et les pratiques du cadre Struts Discussion approfondie sur les principes et les pratiques du cadre Struts Feb 18, 2024 pm 06:10 PM

Analyse des principes et exploration pratique du framework Struts. En tant que framework MVC couramment utilisé dans le développement JavaWeb, le framework Struts a de bons modèles de conception et une bonne évolutivité et est largement utilisé dans le développement d'applications au niveau de l'entreprise. Cet article analysera les principes du framework Struts et l'explorera avec des exemples de code réels pour aider les lecteurs à mieux comprendre et appliquer le framework. 1. Analyse des principes du framework Struts 1. Architecture MVC Le framework Struts est basé sur MVC (Model-View-Con

Compréhension approfondie du principe d'implémentation de l'insertion par lots dans MyBatis Compréhension approfondie du principe d'implémentation de l'insertion par lots dans MyBatis Feb 21, 2024 pm 04:42 PM

MyBatis est un framework de couche de persistance Java populaire qui est largement utilisé dans divers projets Java. Parmi elles, l'insertion par lots est une opération courante qui peut améliorer efficacement les performances des opérations de base de données. Cet article explorera en profondeur le principe de mise en œuvre de l'insertion par lots dans MyBatis et l'analysera en détail avec des exemples de code spécifiques. Insertion par lots dans MyBatis Dans MyBatis, les opérations d'insertion par lots sont généralement implémentées à l'aide de SQL dynamique. En construisant un S contenant plusieurs valeurs insérées

Une discussion approfondie sur les fonctions et les principes des outils Linux RPM Une discussion approfondie sur les fonctions et les principes des outils Linux RPM Feb 23, 2024 pm 03:00 PM

L'outil RPM (RedHatPackageManager) dans les systèmes Linux est un outil puissant pour installer, mettre à niveau, désinstaller et gérer les packages logiciels système. Il s'agit d'un outil de gestion de progiciels couramment utilisé dans les systèmes RedHatLinux et est également utilisé par de nombreuses autres distributions Linux. Le rôle de l'outil RPM est très important. Il permet aux administrateurs système et aux utilisateurs de gérer facilement les progiciels sur le système. Grâce à RPM, les utilisateurs peuvent facilement installer de nouveaux progiciels et mettre à niveau les logiciels existants.

Explication détaillée du principe du plug-in de pagination MyBatis Explication détaillée du principe du plug-in de pagination MyBatis Feb 22, 2024 pm 03:42 PM

MyBatis est un excellent framework de couche de persistance. Il prend en charge les opérations de base de données basées sur XML et les annotations. Il est simple et facile à utiliser. Il fournit également un mécanisme de plug-in riche. Parmi eux, le plug-in de pagination est l'un des plug-ins les plus fréquemment utilisés. Cet article approfondira les principes du plug-in de pagination MyBatis et l'illustrera avec des exemples de code spécifiques. 1. Principe du plug-in de pagination MyBatis lui-même ne fournit pas de fonction de pagination native, mais vous pouvez utiliser des plug-ins pour implémenter des requêtes de pagination. Le principe du plug-in de pagination est principalement d'intercepter MyBatis

Une analyse approfondie des fonctions et des principes de fonctionnement de la commande Linux chage Une analyse approfondie des fonctions et des principes de fonctionnement de la commande Linux chage Feb 24, 2024 pm 03:48 PM

La commande chage dans le système Linux est une commande utilisée pour modifier la date d'expiration du mot de passe d'un compte utilisateur. Elle peut également être utilisée pour modifier la date d'utilisation la plus longue et la plus courte du compte. Cette commande joue un rôle très important dans la gestion de la sécurité des comptes utilisateur. Elle peut contrôler efficacement la période d'utilisation des mots de passe utilisateur et améliorer la sécurité du système. Comment utiliser la commande chage : La syntaxe de base de la commande chage est : chage [option] nom d'utilisateur Par exemple, pour modifier la date d'expiration du mot de passe de l'utilisateur "testuser", vous pouvez utiliser la commande suivante.

Comment utiliser JSONP pour implémenter des requêtes inter-domaines dans Vue Comment utiliser JSONP pour implémenter des requêtes inter-domaines dans Vue Oct 15, 2023 pm 03:52 PM

Introduction à l'utilisation de JSONP pour implémenter des requêtes inter-domaines dans Vue En raison des restrictions de la politique de même origine, le front-end sera dans une certaine mesure gêné lors des requêtes inter-domaines. JSONP (JSONwithPadding) est une méthode de requête inter-domaines. Elle utilise les caractéristiques de la balise <script> pour implémenter les requêtes inter-domaines en créant dynamiquement la balise <script> fonction de rappel. Cet article présentera en détail comment utiliser JSONP dans Vue

Analyse approfondie du principe et de la mise en œuvre de MySQL MVCC Analyse approfondie du principe et de la mise en œuvre de MySQL MVCC Sep 09, 2023 pm 08:07 PM

Analyse approfondie des principes et de la mise en œuvre de MySQLMVCC MySQL est actuellement l'un des systèmes de gestion de bases de données relationnelles les plus populaires. Il fournit un mécanisme de contrôle de concurrence multiversion (Multiversion Concurrency Control, MVCC) pour prendre en charge un traitement simultané efficace. MVCC est une méthode de gestion des transactions simultanées dans la base de données qui peut fournir une simultanéité et une isolation élevées. Cet article fournira une analyse approfondie des principes et de la mise en œuvre de MySQLMVCC, et l'illustrera avec des exemples de code. 1.M

See all articles