Aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur l'erreur de ressource demandée

93

J'essaie de récupérer le flux d'un site Web d'actualités. Je pensais que j'utiliserais l'API de flux de Google pour convertir le flux feedburner en json. L'URL suivante renverra 10 articles du flux, au format json. http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi

J'ai utilisé le code suivant pour obtenir le contenu de l'url ci-dessus

$.ajax({
  type: "GET",
  dataType: "jsonp",
  url: "http://ajax.googleapis.com/ajax/services/feed/load",
  data: {
    "v": "1.0",
    "num": "10",
    "q": "http://feeds.feedburner.com/mathrubhumi"
  },
  success: function(result) {
    //.....
  }
});

mais cela ne fonctionne pas et j'obtiens l'erreur suivante

XMLHttpRequest ne peut pas charger http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http%3A%2F%2Ffeeds.feedburner.com%2Fmathrubhumi . Aucun en-tête «Access-Control-Allow-Origin» n'est présent sur la ressource demandée. L' accès d' origine " http: // localhost " n'est donc pas autorisé.

Comment puis-je réparer ça?

Aneeez
la source
1
J'ai testé votre code ici, avec Chrome et j'ai travaillé comme prévu. Avez-vous essayé d'utiliser l'attribut "crossDomain: true"?
Daniel Loureiro
J'ai hébergé votre code ici: learnwithdaniel.com/test.html . voyez si vous pouvez ouvrir sans erreurs. Si vous n'obtenez pas d'erreur, le problème vient de votre serveur
Daniel Loureiro
génial. C'est donc lié aux en-têtes que votre serveur envoie lorsque votre navigateur fait une demande pour ce code HTML. Vérifiez les "cors headers"
Daniel Loureiro
idem ici avec godaddy api
Gilson Gilbert
Cette question n'est-elle pas un doublon? stackoverflow.com/questions/20035101/ ... Plus important encore, cette autre question a des réponses plus claires / plus approfondies.
The Red Pea

Réponses:

85

Je pense que cela pourrait probablement être que Chrome ne prend pas en charge localhostle Access-Control-Allow-Origin- voir le problème de Chrome

Pour que Chrome envoie l' Access-Control-Allow-Originen-tête, alias simplement votre hôte local dans votre fichier / etc / hosts vers un autre domaine, comme:

127.0.0.1   localhost yourdomain.com

Ensuite, si vous accédez à votre script en utilisant yourdomain.comau lieu de localhost, l'appel devrait réussir.

Thanix
la source
Je vous remercie. Je rencontrais ce problème et le passage à IE Edge m'a amené à voir l'erreur sous-jacente dans le code de mon serveur qui était obscurcie par le refus de Chrome de l'hôte local.
Aluan Haddad
7
Cela ne fonctionne pas non plus pour moi. Peut-être qu'une mise à jour de Chrome a bloqué cette «faille»?
Marty C.
2
Aucune aide ici non plus. Mon site Web est déjà configuré de cette façon, mais j'ai une grande différence. J'utilise un autre port. Je suis sûr que si c'était le même port, cela fonctionnerait. HTTP et HTTPS sont bien sûr des ports différents, ce qui peut causer des problèmes à certains d'entre vous. Le mien n'est pas HTTPS en particulier, mais j'essaie d'accéder à quelque chose sur le même domaine mais à un port différent autre que 80.
Jerry Dodge
Que faire si l'API est accédée par une extension Chrome, que peut-on faire?
viveksinghggits
111

Si vous utilisez le navigateur Google Chrome, vous pouvez pirater avec une extension.

Vous pouvez trouver une extension Chrome qui modifiera les en-têtes CORS à la volée dans votre application. De toute évidence, il ne s'agit que de Chrome, mais j'aime le fait que cela fonctionne avec zéro changement nulle part.

Vous pouvez l'utiliser pour déboguer votre application sur une machine locale (si tout fonctionne en production).

Remarque : si l'URL est rompue, le nom de l'extension est Access-Control-Allow-Origin: * . Je vous recommande de désactiver cette extension lorsque vous ne travaillez pas sur vos contenus, car, par exemple, YouTube ne fonctionne pas avec cette extension.

Dkruchok
la source
Cela a vraiment fonctionné pour moi aussi! ... Je pense que le développeur du plugin l'a mis à jour pour s'adapter à certaines URL que vous entrez manuellement plutôt que de travailler pour tout, j'ai visité Youtube et d'autres sites et cela fonctionne très bien. En tout cas merci beaucoup.
Kingston Fortune
1
ce n'est que pour tester pendant le développement. Les utilisateurs ne vont pas ajouter le plugin dans le navigateur
Légende Newt
Il semble que cette extension ne soit plus disponible, du moins à cette URL. Cette extension semble cependant fonctionner: chrome.google.com/webstore/detail/allow-cors-access-control/…
Gordon
Mais que cette extension fait ? Connaissez-vous une version open source ou que faire pour en écrire une qui modifie les en-têtes de cette façon? Vous ne voulez probablement pas (enfin, d'accord, je ne veux pas) exécuter une extension qui a un accès complet aux URL et aux données sans savoir ce qu'elle fait. Cela semble être une très mauvaise idée si l'extension change de mains, est déjà néfaste, etc. EDIT: Celui mentionné ci-dessous est open source , fwiw.
ruffin le
9

Essayez ceci - définissez l'appel Ajax en configurant l'en-tête comme suit:

var uri = "http://localhost:50869/odata/mydatafeeds"
$.ajax({
    url: uri,
    beforeSend: function (request) {
        request.setRequestHeader("Authorization", "Negotiate");
    },
    async: true,
    success: function (data) {
        alert(JSON.stringify(data));
    },
    error: function (xhr, textStatus, errorMessage) {
        alert(errorMessage);
    }                
});

Ensuite, exécutez votre code en ouvrant Chrome avec la ligne de commande suivante:

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security
Mackander Singh
la source
1

Juste pour info, j'ai remarqué ces informations de la documentation jQuery qui, je pense, s'appliquent à ce problème:

En raison des restrictions de sécurité du navigateur, la plupart des requêtes «Ajax» sont soumises à la même politique d'origine ; la demande ne parvient pas à récupérer les données d'un autre domaine, sous-domaine, port ou protocole.

Changer le fichier hosts comme @thanix n'a pas fonctionné pour moi, mais l'extension mentionnée par @dkruchok a résolu le problème.

pantalon-vancy
la source
0

Chrome ne vous permet pas d'intégrer deux hôtes locaux différents, c'est pourquoi nous obtenons cette erreur. Il vous suffit d'inclure le package Microsoft Visual Studio Web Api Core du gestionnaire de nuget et d'ajouter les deux lignes de code du projet WebApi dans votre WebApiConfig.cs fichier.

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

Alors tout est fait.

Sabrina Ahmed Khan
la source
évidemment cela ne s'applique qu'aux backends dotnet core
hélas
0

Si son service de démarrage de printemps appelant. vous pouvez le gérer en utilisant le code ci-dessous.

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS")
                    .allowedHeaders("*", "Access-Control-Allow-Headers", "origin", "Content-type", "accept", "x-requested-with", "x-requested-by") //What is this for?
                    .allowCredentials(true);
        }
    };
}
Om.
la source
0

Pour le développement, vous pouvez utiliser https://cors-anywhere.herokuapp.com , pour la production, il est préférable de configurer votre propre proxy

async function read() {
   let r= await (await fetch('https://cors-anywhere.herokuapp.com/http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi')).json();
   console.log(r);
}

read();

Kamil Kiełczewski
la source
0

cors unblock fonctionne très bien pour chrome 78 [COrs unb] [1] https://chrome.google.com/webstore/detail/cors-unblock/lfhmikememgdcahcdlaciloancbhjino

c'est un plugin pour google chrome appelé "cors unblock"

Résumé: plus d'erreur CORS en ajoutant l'en-tête `` Access-Control-Allow-Origin: * '' aux requêtes Web locales et distantes lorsqu'il est activé

Cette extension permet de contrôler XMLHttpRequest et les méthodes d'extraction en fournissant des en-têtes personnalisés «access-control-allow-origin» et «access-control-allow-methods» à toutes les requêtes que le navigateur reçoit. Un utilisateur peut activer et désactiver l'extension à partir du bouton de la barre d'outils. Pour modifier la façon dont ces en-têtes sont modifiés, utilisez les éléments du menu contextuel du clic droit. Vous pouvez personnaliser la méthode autorisée. L'option par défaut est d'autoriser les méthodes 'GET', 'PUT', 'POST', 'DELETE', 'HEAD', 'OPTIONS', 'PATCH'. Vous pouvez également demander à l'extension de ne pas écraser ces en-têtes lorsque le serveur les remplit déjà.

Serkan AKMAN
la source
0

Eh bien, une autre façon est d'utiliser le proxy cors, il vous suffit d'ajouter https://cors-anywhere.herokuapp.com/ avant votre URL.Votre URL sera donc comme https://cors-anywhere.herokuapp.com/http : //ajax.googleapis.com/ajax/services/feed/load .

Le serveur proxy reçoit le http://ajax.googleapis.com/ajax/services/feed/load de l'URL ci-dessus. Ensuite, il fait la demande pour obtenir la réponse de ce serveur. Et enfin, le proxy applique le

Access-Control-Allow-Origin: *

à cette réponse originale.

Cette solution est excellente car elle fonctionne à la fois en développement et en production. En résumé, vous profitez du fait que la politique de même origine n'est implémentée que dans la communication navigateur-serveur. Ce qui signifie qu'il n'est pas nécessaire de l'appliquer dans la communication serveur à serveur!

vous pouvez en savoir plus sur la solution ici sur Moyen 3 façons de corriger l'erreur CORS

Mo0rteza
la source
-5

Veuillez utiliser @CrossOriginsur le backendsidecontrôleur de démarrage Spring (niveau de classe ou niveau de méthode) car la solution pour l'en- 'No 'Access-Control-Allow-Origin'tête d' erreur Chrome est présente sur la ressource demandée. '

Cette solution fonctionne pour moi à 100% ...

Exemple: niveau de classe

@CrossOrigin
@Controller
public class UploadController {

----- OU -------

Exemple: niveau méthode

@CrossOrigin(origins = "http://localhost:3000", maxAge = 3600)
@RequestMapping(value = "/loadAllCars")
    @ResponseBody
    public List<Car> loadAllCars() {


Ref: https://spring.io/blog/2015/06/08/cors-support-in-spring-framework
Eddy Joseph
la source
Bien que cela ne réponde certainement pas à la question de l'OP, il a un point valable. La consommation de services / données Spring RESTful via javascript vous oblige à définir l' @CrossOriginannotation. À tous ceux qui votent contre: Veuillez indiquer votre raison!
rwenz3l