Prototyp-AJAX-Anforderung, die als OPTIONS anstelle von GET gesendet wird; ergibt 501 Fehler

7

Ich versuche mit Prototype / AJAX auf einen Webservice zuzugreifen und bekomme einen Fehler, den ich nicht herausfinden kann: Es scheint, dass wenn ich eine Anfrage an einen Server mache, meine Anfrage als OPTIONEN statt als a interpretiert wird GET Anfrage (und wiederum wirft einen 501 - nicht implementiert Fehler, da der Server nur GET-Anfragen erlaubt, basierend auf was ich von Access-Control-Request-Method: verstehe). Fehle ich etwas in meiner AJAX / Anfrageformulierung, die diesen Fehler verursachen könnte? Ich habe ein bisschen in CORS / Preflight-Anfragen hier gelesen, aber ich bin mir nicht sicher, wie es geht anwenden, wenn mein Code konform aussieht ...

Hier ist die relevante AJAX-Anfrage:

%Vor%

und hier ist der Fehler und die relevanten Anforderungsinformationen, die ich von Chrome erhalten habe:

%Vor%

Was könnte ich hier übersehen? Warum sagt Chrome, dass die Anfrage als OPTIONS statt als GET gesendet wird? Wenn Chrome die Access-Control-Request-Headers: Informationen ausspuckt, sind dies ausschließlich die einzigen in der Anfrage erlaubten Header?

Danke!

    
Philip David 11.12.2012, 06:20
quelle

4 Antworten

14

Zu viele Stunden auf der Suche nach einer korrekten Reparatur von prototypejs ... endlich haben wir eine nicht-intrusive Lösung auf großen Kourge (Wilson Lee) Artikel ! Hier ist ein Auszug:

  

Die meisten großen Ajax-Frameworks legen benutzerdefinierte HTTP-Header für die Ajax-Anfragen fest, die Sie instanziieren. Der beliebteste Header ist X-Requested-With: XMLHttpRequest. Folglich wird Ihre Anfrage in eine Preflight-Anfrage umgewandelt und schlägt fehl. Die Fehlerbehebung besteht darin, zu verhindern, dass Ihr JavaScript-Framework diese benutzerdefinierten Header festlegt, wenn Ihre Anfrage domänenübergreifend ist. jQuery vermeidet bereits geschickt das versehentliche Preflighting von Anfragen, indem es keine benutzerdefinierten Header setzt, wenn Ihre URL als entfernt betrachtet wird. Sie müssen dies manuell verhindern, wenn Sie andere Frameworks verwenden.

Es kann so einfach sein wie:

%Vor%

Wenn Sie einen Nachteil / eine Verbesserung für diese Lösung sehen, begrüßen wir Sie zum Teilen:)

    
Katapofatico 08.03.2013 17:39
quelle
6

Tatsächlich handelt es sich um Preflight-Anfrage , da Prototype benutzerdefinierte Header hinzufügt X-Requested-With, X-Prototype-Version zur Anfrage. Wegen dieser Header sendet Browser die erste OPTIONS Anfrage. XHR spec sagt:

  

Für Anfragen mit nicht gleicher Herkunft, die die HTTP-GET-Methode verwenden, wird eine Preflight-Anfrage gemacht, wenn andere Header als Accept und Accept-Language gesetzt sind.

Wie löst man dieses Problem? Ich kann nur eine Möglichkeit sehen, dies so schnell wie möglich zu lösen: vollständig überschreibende Methode Ajax.Request#setRequestHeaders() , z. Fügen Sie dieses Skript direkt nach Prototype.js ein:

%Vor%

Dieser Patch entfernt benutzerdefinierte Header von jeder AJAX-Anfrage. Falls Sie diese Header für Nicht-CORS-Anfragen noch benötigen, können weitere Logik hinzugefügt werden, die die Möglichkeit bietet, diese Header in Optionen für new Ajax.Request() zu deaktivieren (ich werde diese Variante hier überspringen, um die Antwort kürzer zu machen).

    
Victor 11.12.2012 19:24
quelle
1

Eigentlich ist es mit Prototype.js V1.7 viel einfacher:

%Vor%

Prototype.js löscht alle vordefinierten Header, wenn der Wert null ist.

    
rumpel 02.09.2015 10:48
quelle
0

Ich habe Prototype noch nie benutzt und bin mir nicht sicher, wie viel ich verwenden werde. Aber ich habe mir die Dokumente kurz angesehen und ich habe keine Unterstützung für Methoden und Parameter gefunden.

Also versuchen Sie:

%Vor%

Ich habe auch bemerkt, dass StationString in Ihrem Beispiel in Anführungszeichen stehen sollte, vorausgesetzt, es ist keine Variable.

    
Adam 11.12.2012 06:29
quelle