Selon jQuery:
crossDomain (default: false for same-domain requests, true for cross-domain requests)
Type: Boolean Si vous souhaitez forcer un demande crossDomain (telle que JSONP) sur le même domaine, définissez la valeur de crossDomain à true. Cela permet, par exemple, au serveur redirection vers un autre domaine. (version ajoutée: 1.5)
Je ne comprends pas ce qui précède.
Si le code est
$(document).ready(function ()
{
$.ajax(
{
url: 'http://es3.com/Handlers/MyHandler.ashx',
cache: false,
dataType: "jsonp",
...
...
});
});
function aaa(json)
{
alert(json.result);
}
Et en spécifiant datatype:jsonp
, alors la réponse sera typée application/javascript, car c'est un script qui s'exécutera dans mon navigateur.
Je ne vois aucune raison pourquoi il n'agirait pas comme cela lorsque j'exécute ce code sous le domaine même. (donc - je ne vois pas les usages pour cette propriété).
J'ai fait un échantillon
J'ai 2 domaines (hôte modifié). es2.com
et es3.com
.
(remarquez que l'URL dans le code est toujours à es3.com)
Test n ° 1:
Exécutez le code à partir de es3.com
: (volet gauche)
Exécutez le code à partir de es2.com
: (volet de droite)crossDomain:false
(défaut si manquant).
regardez les différences: ( http://i.stack.imgur.com/RKyZp.jpg )
Test n ° 2:
Exécutez le code à partir de es3.com
: (volet gauche)
Exécutez le code à partir de es2.com
: (volet de droite)crossDomain:true
<--- avis
( http://i.stack.imgur.com/xEcyd.jpg )
Je ne vois aucune différence.
Question:
Pourquoi/quand dois-je définir la propriété crossDomain
?
Le par défaut pour crossDomain
est le suivant:
false pour les demandes du même domaine, true pour les demandes crossDomain
Le data-type
est interprété différemment selon la valeur du paramètre crossDomain
:
"json": évalue la réponse en tant que JSON et renvoie un code JavaScript objet. Les demandes "json" entre domaines sont converties en "jsonp" sauf si la requête inclut jsonp: false dans ses options de requête
Parce que vous utilisez jsonp
au lieu de json
, vous ne verrez aucune différence dans vos tests.
Quand dois-je définir la propriété crossDomain?
Si vous faites une même demande de domaine json
, et votre site peut rediriger la demande vers un autre domaine afin de servir la réponse (via HTTP 3XX), vous devez définir la propriété crossDomain
sur true afin que la réponse puisse être lue votre script d'appel.
Cela vous donne l'avantage de récupérer JSON lorsque vous effectuez les mêmes requêtes Origin et les fonctionnalités de JSONP lorsque vous effectuez des requêtes croisées. Si CORS est actif sur le domaine que vous redirigez, vous pouvez définir jsonp: false
dans les options de la demande.
crossDomain
automatiquement défini sur true.jsonp
.Résultat: JSONP renvoyé par example.org.
crossDomain
automatiquement défini sur false.jsonp
.Résultat: JSONP renvoyé par exemple.com.
crossDomain
automatiquement défini sur true.json
.Résultat: JSONP renvoyé par example.org.
crossDomain
automatiquement défini sur false.json
.Résultat: JSON renvoyé par exemple.com.
crossDomain
automatiquement défini sur true.json
.jsonp
est défini sur false.Résultat: erreur CORS renvoyée par le navigateur.
crossDomain
défini manuellement sur true.json
.Résultat: JSONP renvoyé par example.edu.
crossDomain
automatiquement défini sur true.json
.jsonp
est défini sur false.Résultat: JSON renvoyé par example.org.
crossDomain
automatiquement défini sur false.json
.Résultat: erreur CORS renvoyée par le navigateur.
Supposons que vous avez un autre domaine spanish.es2.com
qui sert les utilisateurs espagnols de votre site Web.
Vous avez l'exigence suivante:
Avoir une page web sur es2.com
Appelez une api sur es2.com
et transmettez-lui des informations sur l'utilisateur (ou un cookie), et obtenez des données sur l'utilisateur. Mais si l'utilisateur est espagnol, l'api sur spanish.es2.com
doit être appelé pour les mêmes données.
Lorsque vous faites une demande ajax avec jQuery d'es2.com à es2.com, pour un utilisateur espagnol:
(a) Si crossdomain
est désactivé: votre es2.com
api trouvera que l'utilisateur est espagnol et effectue donc une redirection http vers spanish.es2.com
, qui ne fonctionnera pas en raison de la stratégie de domaine ajax identique et qui échouerait. Redirections dans une URL ajax -> Interdit.
(b) Lorsque crossdomain
est activé: la réponse jsonp de votre api es2.com est en fait chargée en tant que balise de script encapsulée dans une fonction. Par conséquent, une redirection http vers un autre domaine n'a pas d'importance et le contenu est toujours chargé. Par conséquent, ajax fonctionne. Redirections dans src d'une balise de script -> Autorisé.
J'espère que cela rend les choses claires.
Autant que je sache, l'opération est correcte. Définir dataType sur jsonp créera une requête de type JSONP; avec le résultat écrit dans un bloc de script et exécuté. Par conséquent, forcer JSONP en définissant cross-domain sur true semble redondant.
Toutefois. La documentation indique que "si vous souhaitez forcer une requête interdomaine telle que JSONP", cela implique donc qu'il peut arriver que vous souhaitiez forcer un comportement interdomaine. Je ne suis cependant pas sûr de ce que pourraient être ces cas.
Ce n'est pas faux par défaut lorsqu'il est manquant. Lorsqu'il manque, la valeur par défaut est true si les domaines ne sont pas identiques (comme dans votre premier exemple ci-dessus). Je pense que vous pouvez laisser sa valeur par défaut dans presque tous les cas.
En outre, lors de la définition du paramètre inter-domaines, JQuery tente d'utiliser CORS par défaut, pas JSONP.
Voici quelques extraits pertinents de la source JQuery: https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js
variable "xhrSupported" ...
xhrSupported = jQuery.ajaxSettings.xhr();
..est utilisé pour vérifier le support CORS ....
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
.. qui est coché lors d'appels AJAX ....
jQuery.ajaxTransport(function( options ) {
var callback;
// Cross domain only allowed if supported through XMLHttpRequest
if ( support.cors || xhrSupported && !options.crossDomain )
J'espère que cela t'aides!
Votre question m'a été très utile pour comprendre le problème que j'ai rencontré sur l'utilisation de jsonp avec jQuery.
Dans mon cas, je devais effectuer un appel JSONP vers un domaine externe.
Mais l'URL devait être construit à partir de notre domaine.
Par exemple, ici, je suppose que mon site Web est sous es2.com
Appel JSONP sur es2.com
es2.com redirect sur es3.com?newConstructedUrl=someRandomValue
es3.com?newConstructedUrl=NewCoolValue redirect sur es2.com
es2.com reply définissant un nouveau cookie dans la réponse
Le code fonctionnait bien dans localhost, mais nous n’avions pas de cookie dans es2 .
Et en voyant le débogueur, la demande était en XHR dans es2 environnement
Nous devions ensuite définir le paramètre crossDomain sur true. La demande JSONP a ensuite été effectuée même dans es2.com
J'espère que mon cas d'utilisation est clair!
Si vous spécifiez déjà JSONP, le paramètre crossDomain ne fait pas grand chose. Il demande simplement à jQuery de demander JSONP même s'il s'agit d'un domaine local.
Supposons que vous travaillez sur votre machine avec un service local qui renvoie JSON ou JSONP. Vous pouvez utiliser un simple appel $.ajax()
, qui fonctionne correctement. En production, toutefois, le serveur redirige votre demande vers un autre domaine si vous remplissez certaines conditions. Prod doit demander JSONP, car parfois la réponse provient de hors-domaine.
Faire cet appel $.ajax()
sans crossDomain: true
ou datatype: 'jsonp'
supposera que la réponse peut être en JSON simple, donc le code échouera en production.
Vous pouvez également obtenir du XML interdomaine par le biais de prestidigitation comme en chargeant JSONP avec YQL , ce qui est vraiment juste en le recouvrant dans JSONP.