Ich habe die Drittanbieter-API mit Jquery AJAX aufgerufen. Ich erhalte folgenden Fehler in der Konsole:
Cross-Origin Read Blocking (CORB) blockierte die Cross-Origin-Antwort MY URL mit MIME-Typ application / json. Weitere Informationen finden Sie unter https://www.chromestatus.com/feature/5629709824032768 .
Ich habe folgenden Code für den Ajax-Aufruf verwendet:
$.ajax({
type: 'GET',
url: My Url,
contentType: 'application/json',
dataType:'jsonp',
responseType:'application/json',
xhrFields: {
withCredentials: false
},
headers: {
'Access-Control-Allow-Credentials' : true,
'Access-Control-Allow-Origin':'*',
'Access-Control-Allow-Methods':'GET',
'Access-Control-Allow-Headers':'application/json',
},
success: function(data) {
console.log(data);
},
error: function(error) {
console.log("FAIL....=================");
}
});
Beim Einchecken in Fiddler habe ich die Daten als Antwort erhalten, jedoch nicht in der Ajax-Erfolgsmethode.
Bitte hilf mir.
Antworten:
Sie stellen eine JSONP-Anfrage, aber der Server antwortet mit JSON.
Der Browser weigert sich, den JSON als JSONP zu behandeln, da dies ein Sicherheitsrisiko darstellen würde. (Wenn der Browser hat die JSON als JSONP zu behandeln versucht , dann wäre es allenfalls gescheitert).
In dieser Frage finden Sie weitere Informationen zu JSONP. Beachten Sie, dass dies ein böser Hack ist, um die Same Origin-Richtlinie zu umgehen, die verwendet wurde, bevor CORS verfügbar war. CORS ist eine viel sauberere, sicherere und leistungsfähigere Lösung für das Problem.
Es sieht so aus, als würden Sie versuchen, eine Cross-Origin-Anfrage zu stellen, und alles, was Sie sich vorstellen können, in einem riesigen Stapel widersprüchlicher Anweisungen darauf werfen.
Sie müssen verstehen, wie die Richtlinie für denselben Ursprung funktioniert.
In dieser Frage finden Sie eine ausführliche Anleitung.
Nun ein paar Anmerkungen zu Ihrem Code:
Entfernen Sie das.
Entferne das. (Sie könnten den Server stattdessen mit JSONP antworten lassen, aber CORS ist besser).
Dies ist keine von jQuery.ajax unterstützte Option. Entferne das.
Dies ist die Standardeinstellung. Entfernen Sie dies, es sei denn, Sie setzen es mit ajaxSetup auf true.
quelle
https://www.chromium.org/Home/chromium-security/corb-for-developers
Ich musste den Cache meines Browsers bereinigen. Ich habe in diesem Link gelesen, dass wir diesen Warnfehler erhalten, wenn die Anfrage eine leere Antwort erhält. Ich habe einige CORS auf meine Anfrage bekommen, und so wurde die Antwort auf diese Anfrage leer. Alles, was ich tun musste, war den Cache des Browsers zu leeren, und die CORS entkam. Ich erhielt CORS, weil das Chrome die PORT-Nummer im Cache gespeichert hatte. Der Server akzeptierte dies nur
localhost:3010
und ich tat eslocalhost:3002
aufgrund des Caches.quelle
Antwort mit Header 'Access-Control-Allow-Origin: *' zurückgeben Überprüfen Sie den folgenden Code für die Antwort des PHP-Servers.
quelle
Content-Type: application/json
darin verursacht wird. Der OP-Code muss dies bereits tun.Sie müssen CORS auf der Serverseite hinzufügen:
Wenn Sie nodeJS verwenden, dann:
Zuerst müssen Sie mit dem folgenden Befehl installieren
cors
:Fügen Sie nun den folgenden Code zu Ihrer App-Startdatei hinzu, z. B. (
app.js or server.js
)quelle
Aus der Frage geht nicht hervor, aber vorausgesetzt, dass dies auf einem Entwicklungs- oder Testclient geschieht, und wenn Sie Fiddler bereits verwenden, können Sie Fiddler mit einer zulässigen Antwort antworten lassen:
AutoResponder
RegisterkarteAdd Rule
und bearbeiten Sie die Regel, um:Method:OPTIONS http://localhost
*CORSPreflightAllow
Unmatched requests passthrough
Enable Rules
Ein paar Anmerkungen:
quelle
Wenn Sie an localhost arbeiten, versuchen Sie dies, dies ist die einzige Erweiterung und Methode, die für mich funktioniert hat (Angular, nur Javascript, kein PHP)
https://chrome.google.com/webstore/detail/moesif-orign-cors-changer/digfbfaphojjndkpccljibejjbppifbc/related?hl=de
quelle
Haben Sie versucht, die
dataType
in Ihrer Ajax-Anfrage von aufjsonp
zu ändernjson
? das hat es in meinem Fall behoben.quelle
In einer Chrome-Erweiterung können Sie verwenden
um die Server-Antwortheader neu zu schreiben. Sie können entweder einen vorhandenen Header ersetzen oder einen zusätzlichen Header hinzufügen. Dies ist der gewünschte Header:
https://developers.chrome.com/extensions/webRequest#event-onHeadersReceived
Ich war in CORB-Fragen festgefahren, und das hat es für mich behoben.
quelle
Antwortheader werden im Allgemeinen auf dem Server festgelegt. Stellen Sie
'Access-Control-Allow-Headers'
auf'Content-Type'
auf Server - Seitequelle
Cross-Origin Read Blocking (CORB), ein Algorithmus, mit dem zweifelhafte Cross-Origin-Ressourcenlasten von Webbrowsern identifiziert und blockiert werden können, bevor sie die Webseite erreichen. Er soll verhindern, dass der Browser bestimmte Cross-Origin-Netzwerkantworten liefert zu einer Webseite.
Stellen Sie zunächst sicher, dass diese Ressourcen mit einem korrekten "
Content-Type
" bereitgestellt werden, dh für den JSON-MIME-Typ - "text/json
", "application/json
", den HTML-MIME-Typ - "text/html
".Zweitens: Stellen Sie den Modus auf cors, dh
mode:cors
Der Abruf würde ungefähr so aussehen
Referenzen: https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md
https://www.chromium.org/Home/chromium-security/corb-for-developers
quelle
In diesem Zusammenhang gibt es einen erwähnenswerten Randfall: Chrome (zumindest einige Versionen) überprüft CORS-Preflights mithilfe des für CORB eingerichteten Algorithmus . IMO, das ist ein bisschen albern, weil Preflights das CORB-Bedrohungsmodell nicht zu beeinflussen scheinen und CORB orthogonal zu CORS zu sein scheint. Außerdem ist der Körper eines CORS-Preflights nicht zugänglich, sodass es keine negative Konsequenz gibt, sondern nur eine irritierende Warnung.
Überprüfen Sie auf jeden Fall , ob Ihre CORS-Preflight-Antworten (OPTIONS-Methodenantworten) keinen Body haben (204) . Eine leere 200 mit Inhaltstyp Anwendung / Oktett-Stream und Länge Null hat auch hier gut funktioniert.
Sie können bestätigen, ob dies der Fall ist, indem Sie CORB-Warnungen im Vergleich zu OPTIONS-Antworten mit einem Nachrichtentext zählen.
quelle
Es scheint, dass diese Warnung aufgetreten ist, als eine leere Antwort mit einer 200 gesendet wurde.
Diese Konfiguration in meinem
.htaccess
Display zeigt die Warnung auf Chrome:Aber ändern Sie die letzte Zeile auf
Löse das Problem!
quelle
Ich hatte das gleiche Problem mit meiner Chrome-Erweiterung. Als ich versuchte, meinem Manifest die Option "content_scripts" hinzuzufügen, diesen Teil:
Und ich entferne den anderen Teil aus meinen offensichtlichen "Berechtigungen":
Erst wenn ich es lösche, verschwindet CORB auf einer meiner XHR-Anfragen.
Das Schlimmste ist, dass mein Code nur wenige XHR-Anforderungen enthält und nur einer von ihnen einen CORB-Fehler erhält (warum CORB nicht auf anderen XHR angezeigt wird, weiß ich nicht; warum offensichtliche Änderungen diesen Fehler verursacht haben, weiß ich nicht). Deshalb habe ich den gesamten Code einige Stunden lang immer wieder überprüft und viel Zeit verloren.
quelle
Wenn Sie dies auf einer Safari tun, dauert es keine Zeit. Aktivieren Sie einfach das Entwicklermenü unter Einstellungen >> Datenschutz und deaktivieren Sie im Entwicklungsmenü die Option "Ursprungsübergreifende Einschränkungen deaktivieren". Wenn Sie nur lokal möchten, müssen Sie nur das Entwicklermenü aktivieren und im Entwicklungsmenü "Lokale Dateibeschränkungen deaktivieren" auswählen.
und in Chrome für OSX öffnen Sie das Terminal und führen Sie Folgendes aus:
Für Linux ausführen:
Auch wenn Sie versuchen, für Entwicklungszwecke wie AJAX oder JSON auf lokale Dateien zuzugreifen, können Sie dieses Flag ebenfalls verwenden.
Gehen Sie für Windows in die Eingabeaufforderung und in den Ordner, in dem sich Chrome.exe befindet, und geben Sie ein
Dadurch sollte dieselbe Ursprungsrichtlinie deaktiviert werden und Sie können auf lokale Dateien zugreifen.
quelle
Ich bin auf dieses Problem gestoßen, weil das Format der JSONP-Antwort vom Server falsch ist. Die falsche Antwort lautet wie folgt.
Das Problem ist, dass das darin enthaltene Objekt
callback
ein korrektes JSON-Objekt anstelle eines JSON-Arrays sein sollte. Also habe ich einen Servercode geändert und sein Format geändert:Der Browser akzeptierte die Antwort nach der Änderung gerne.
quelle
callback(["apple", "peach"])
ist vollkommen gültiges JSONP und hat gut funktioniert, als ich es über verschiedene Ursprünge hinweg getestet habe.Versuchen Sie, die Erweiterung "Moesif CORS" zu installieren, wenn Sie Probleme mit Google Chrome haben. Da es sich um eine originensübergreifende Anforderung handelt, akzeptiert Chrome keine Antwort, selbst wenn der Antwortstatuscode 200 lautet
quelle