Comment les mashups fonctionnent-ils avec la même stratégie d'origine?

11

Si Javascript n'est autorisé qu'à accéder aux scripts du même domaine, comment un site Web peut-il créer des mashups qui doivent lire et modifier le contenu d'un autre domaine?

Jack Richardson
la source

Réponses:

7

Solutions multi-navigateurs

JSONP

Si l'API à laquelle vous essayez d'accéder prend en charge JSONP , il vous suffit de fournir un nom de fonction javascript dans votre demande, puis le JSONP renvoie du javascript comme celui myfunc({the:data});que vous pouvez exécuter comme un javascript standard, c'est pourquoi vous devez créer une nouvelle <script src="www.website.com/somecall?jsonp=myfunc">balise pour "envoyer une demande" (jQuery le fait automatiquement si vous l'utilisez type: jsonpdans des $.ajaxdemandes).

L'inconvénient est que le fournisseur de l'API doit prendre en charge JSONP.

Éclat

Flash peut accéder au contenu interdomaines tant que le site Web cible a un crossdomain.xmlfichier à sa racine qui dit qu'il le permet, ce qui est généralement le cas sur les serveurs qui fournissent une API).

L'inconvénient est qu'il nécessite Flash dans le navigateur de l'utilisateur et que le site Web dont vous obtenez les données doit avoir un crossdomain.xml qui autorise les demandes interdomaines.

Script côté serveur sur le même nom de domaine

Les langages côté serveur comme PHP n'ont pas de restrictions BS dans le même domaine, vous pouvez donc avoir un script qui agit comme proxy (par exemple, télécharger via l'une des extensions http comme cURL).

L'avantage supplémentaire est que vous pouvez nettoyer les données (ou même mélanger plusieurs sources) sur le serveur, avant de les transférer vers votre page Web / javascript, de sorte que vous pouvez même extraire uniquement la partie utile des données, ce qui est bien lorsque vous faites une application Web mobile où la bande passante peut être un problème.

L'inconvénient est que toutes les demandes doivent passer par votre serveur, ce qui augmente la charge sur votre serveur.

Cependant, l'avantage est qu'il fonctionnerait avec n'importe quelle ressource car il ne nécessite pas que la cible prenne en charge crossdomain ou jsonp. Donc, si rien d'autre ne fonctionne, ce serait le cas.


Solutions spécifiques à certains navigateurs

Internet Explorer

Internet Explorer a une demande interdomaine

Firefox

Firefox 3.5+ possède la norme de partage d'origine croisée , mais il nécessite la ressource à laquelle vous essayez d'accéder pour inclure des en-têtes spéciaux, par exemple en PHP:

header("content-type: Access-Control-Allow-Origin: *");
header("content-type: Access-Control-Allow-Methods: GET");

Quelques autres principaux navigateurs le prennent également en charge , donc si vous n'avez pas besoin de prendre en charge les anciens navigateurs et si vous pouvez obtenir les ressources auxquelles vous essayez d'accéder pour envoyer ces en-têtes, cela peut être votre meilleur pari, sinon le côté serveur le script serait ma recommandation.


Firefox a également un paramètre utilisateur capability.policy.default.XMLHttpRequest.open, mais je ne compterais pas sur le fait que l'utilisateur modifie un paramètre dans son navigateur.

pics sauvages
la source
0

Vous pouvez utiliser l'API (d'un autre domaine) pour cela. Votre Javascript appellera le fichier PHP (ou un autre fichier de script) qui se trouve sur votre serveur Web (votre domaine), qui appellera l'API (d'un autre domaine utilisant CURL) et vous obtiendra la réponse.

Harish Kurup
la source
Cette réponse n'a pas besoin d'être aussi précise sur la technologie utilisée sur le serveur.
funkybro
@ funkybro ouais, c'était juste un exemple ... rien de spécifique ...
Harish Kurup