Est-il possible de publier des données sur JsonP? Ou est-ce que toutes les données doivent être passées dans la chaîne de requête en tant que requête GET?
J'ai beaucoup de données à envoyer au service, à travers le domaine, et elles sont trop volumineuses pour être envoyées via la chaîne de requête
Quelles sont les options pour contourner ce problème?
POST
requêtes à d'autres domaines tant que ce domaine et votre navigateur sont pris en chargeCORS
. Mais c'est tout à fait vraiPOST
etJSONP
ne sont pas compatibles.<script>
balises qui pointent vers un autre domaine. La seule façon d'exécuter des requêtes POST dans un navigateur est via des formulaires HTML ou XMLHttpRequest.Si vous avez besoin d'envoyer beaucoup de données entre domaines. Je crée généralement un service que vous pouvez appeler en deux étapes:
Tout d'abord, le client effectue un envoi de FORMULAIRE (post autorisé cross domain). Le service stocke l'entrée dans la session sur le serveur (en utilisant le GUID comme clé). (le client crée un GUID et l'envoie dans le cadre de l'entrée)
Ensuite, le client effectue une injection de script normale (JSONP) en tant que paramètre que vous utilisez le même GUID que celui que vous avez utilisé dans la publication FORM. Le service traite l'entrée de la session et renvoie les données à la manière JSONP normale. Après cela, la session est détruite.
Cela dépend bien sûr du fait que vous écrivez le serveur principal.
la source
XMLHttpRequest
ne devrait pas du tout être impliqué. La réponse de Per utilise une soumission de formulaire régulière pour effectuer la requête POST, puis une injection d'élément de script pour effectuer la requête GET.Je sais que c'est une sérieuse nécromancie, mais j'ai pensé publier mon implémentation de JSONP POST en utilisant jQuery, que j'utilise avec succès pour mon widget JS (ceci est utilisé pour l'enregistrement et la connexion des clients):
Fondamentalement, j'utilise une approche IFrame, comme suggéré dans la réponse acceptée. Ce que je fais différemment, c'est qu'après l'envoi de la demande, je regarde si le formulaire peut être atteint dans l'iframe, à l'aide d'un minuteur. Lorsque le formulaire ne peut être atteint, cela signifie que la demande est de retour. Ensuite, j'utilise une requête JSONP normale pour demander le statut de l'opération.
J'espère que quelqu'un le trouvera utile. Testé dans> = IE8, Chrome, FireFox et Safari.
la source
En général, JSONP est implémenté en ajoutant un
<script>
balise au document appelant, de sorte que l'URL du service JSONP soit le "src". Le navigateur récupère la source du script avec une transaction HTTP GET.Maintenant, si votre service JSONP est dans le même domaine que votre page d'appel, vous pourriez probablement bricoler quelque chose avec un simple
$.ajax()
appel. Si ce n'est pas dans le même domaine, je ne sais pas comment cela serait possible.la source
CORS
cela sera possible tant que le navigateur le prend également en charge. Dans ces cas, vous utiliserez plainJSON
plutôt queJSONP
.Vous pouvez utiliser un proxy CORS en utilisant ce projet . Il dirigerait tout le trafic vers un point de terminaison de votre domaine et relayerait ces informations vers un domaine externe. Étant donné que le navigateur enregistre toutes les demandes pour être sur le même domaine, nous pouvons publier JSON. REMARQUE: cela fonctionne également avec les certificats SSL détenus sur le serveur.
la source
Il y a une solution (de piratage) que j'ai faite plusieurs fois, vous pourrez publier avec JsonP. (Vous pourrez publier un formulaire, plus grand que 2000 caractères que vous pouvez utiliser par GET)
Javascript de l'application client
JAVA:
PHP:
En faisant comme cela, vous ouvrez votre serveur à toute demande de publication, vous devez le sécuriser à nouveau en fournissant ident ou autre chose.
Avec cette méthode, vous pouvez également changer le type de demande de jsonp à json, les deux fonctionnent, il suffit de définir le bon type de contenu de réponse
jsonp
json
Veuillez noter que votre serveur ne respectera plus la SOP (même politique d'origine), mais qu'importe?
la source
<script>
balises dans votre DOM HTML (vous pouvez même les utiliser dans des applications de bureau, disons que vous vouliez faire plusieurs demandes JSON au même serveur et que vous vouliez utiliser le nom de la fonction comme ID de suivi de demande par exemple).C'est possible, voici ma solution:
Dans votre javascript:
Dans votre url.php:
la source