web-dev-qa-db-fra.com

comment Postman envoie les demandes? ajax, même politique d'origine

J'ai trouvé cette extension très utile chrome extension appelée postman, c'est une extension très utile surtout lorsque vous êtes dans la programmation d'applications RESTful.

Une chose sur laquelle je suis confus est la façon dont ce plugin/extension est capable d'envoyer avec succès la requête POST sur différents domaines?

J'ai essayé de voter dans un sondage en utilisant Postman comme celui-ci. Voting using Postman

Après avoir soumis cela, le vote a été effectivement compté, mais lorsque j'ai essayé de le faire en utilisant ajax et javascript, il échoue, en raison de la politique d'origine différente des navigateurs.

Comment est-ce possible?

Voici mon code utilisant jquery. Je l'ai utilisé dans mon ordinateur, localhost.

init: function() {
    $.ajax({
        url: 'http://domain.com/vote.php',
        type:'POST',
        dataType: 'html',
        data: {
            id: '1'
        },
        success: function(data) {
        if ( data == 'voted' ) {
            $('.set-result').html( 'you already voted. try again after 24 hours' );
        } else {
            $('.set-result').html( 'successfully voted' );
        }
    }
    });
},
44
Joey Hipolito

Les applications packagées Chrome peuvent avoir des autorisations inter-domaines. Lorsque vous installez Postman, il vous demande que cette application accède à n'importe quel domaine.

En plaçant */* dans la section permissions de votre fichier manifeste, vous pouvez le faire.

En savoir plus ici: https://developer.chrome.com/extensions/xhr.html

33
Mohsen

Vous pouvez ajouter l'en-tête suivant à la demande Ajax envoyée dans postman.

Content-Type      application/json

X-Requested-With  XMLHttpRequest

Capture d'écran

enter image description here

Crédit à Orion

9
chebaby

Cela ressemble au site qui héberge le sondage (le script "vote.php") doit avoir un en-tête "Access-Control-Allow-Origin" pour permettre la publication à partir d'une liste de sites (ou de tous les sites).

Une valeur de * pour l'en-tête permettra la publication depuis n'importe quel site Web:

Access-Control-Allow-Origin: *

c'est-à-dire que vous pouvez mettre ce qui suit en haut du vote.php

header('Access-Control-Allow-Origin: *');

Les extensions et applications Chrome ne sont pas soumises aux mêmes limitations de sécurité que celles des pages Web normales.

Conseils de débogage supplémentaires:

Si vous essayez d'accéder à des services distants à partir de pages Web que vous avez ouvertes sur votre système de fichiers local dans votre navigateur, il se peut que votre navigateur leur applique des règles de sécurité différentes de celles appliquées aux fichiers servis à partir d'un service Web.

par exemple. Si vous ouvrez des fichiers locaux à partir d'un emplacement comme C:\MyDocuments\weboot\index.htm (Windows) ou \Users\joe\Sites\index.html (Mac) dans votre navigateur, votre demande AJAX peut ne pas fonctionner, même avec l'en-tête spécifié dans la plupart des navigateurs.

Safari d'Apple n'applique presque aucune restriction inter-domaines aux fichiers ouverts localement, mais Firefox est beaucoup plus strict quant à ce qu'il autorise, avec Chrome quelque part au milieu. Exécuter un serveur Web localement (par exemple sur http://localhost/) est une bonne idée pour éviter un comportement inattendu.

En outre, d'autres bibliothèques qui fournissent des fonctions pour gérer les demandes Ajax (telles que AngularJS) peuvent nécessiter la définition d'autres en-têtes sur le serveur par défaut. Vous pouvez généralement voir la raison de l'échec dans une console de débogage du navigateur.

3
Iain Collins