Wie antworte ich auf eine HTTP OPTIONS-Anfrage?

84

Die HTTP- OPTIONSMethode wird angeblich verwendet, um zu bestimmen, welche anderen Methoden der Server für eine bestimmte Ressource unterstützt. Angesichts dessen habe ich zwei Fragen:

  • Wie sieht diese Antwort aus? Ich habe Beispiele mit CSV - Listen gesehen in Public, Allowund sogar Access-Control-Allow-MethodsHeader. Werden sie alle gebraucht? Was ist der Unterschied? RFC 2616 scheint hier nicht sehr hilfreich zu sein.

  • Wäre es angemessen, dies zu verwenden, um die Aktionen aufzulisten, die eine Ressource in einer Nicht-REST-API-Umgebung unterstützt? Wenn ich zum Beispiel ConversionControllerdie Aktion unterstütze convert, wäre eine solche Antwort sinnvoll:

Anfrage:

OPTIONS /conversion HTTP/1.1

Antwort:

HTTP/1.1 200 OK
...
Allow: CONVERT
...
FtDRbwLXw6
quelle
2
Allow: CONVERT??
Pacerier

Antworten:

20

RFC 2616 definiert "Zulassen" ( http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.7 ). "Öffentlich" wird nicht mehr verwendet. "Access-Control-Allow-Methods" ist in der CORS-Spezifikation definiert (siehe http://www.w3.org/TR/cors/ ).

Julian Reschke
quelle
Danke für die Abklärung. Im Fall von CORS sollte sowohl die Allowund Access-Control-Allow-Methodsgesendet, oder einfach nur die letzteren werden?
FtDRbwLXw6
Ich würde immer "Zulassen" zurückgeben, also kein Sonderfall CORS.
Julian Reschke
6
Was ist mit Inhalten? Kann Körperinhalt verfügbar sein?
CMCDragonkai
2
@CMCDragonkai Ja, OPTIONSmöglicherweise Inhalt. Aus RFC 2616: "Wenn die OPTIONS-Anforderung einen Entity-Body enthält (wie durch das Vorhandensein von Content-Length oder Transfer-Encoding angezeigt), MUSS der Medientyp durch ein Content-Type-Feld angegeben werden. Obwohl diese Spezifikation nicht definiert ist Bei jeder Verwendung für einen solchen Body können zukünftige Erweiterungen von HTTP den OPTIONS-Body verwenden, um detailliertere Abfragen auf dem Server durchzuführen. Ein Server, der eine solche Erweiterung nicht unterstützt, kann den Anfragetext verwerfen. "
Bischof
Ich glaube, dass beide Allowund Access-Control-Allow-Methodserforderlich sind, wenn Sie CORS verwenden möchten. Ersteres gibt an, welche Methoden im Allgemeinen unterstützt werden, und letzteres gibt an, welche Methoden für Ursprungsanfragen zulässig sind. Beispielsweise können Sie , und für Ihren eigenen Ursprung zulassen GET, aber nur und für den Kreuzursprung zulassen . POSTPUTDELETEGETPOST
Mikko Rantalainen
8

Antwort auf den Titel: "Wie antworte ich auf eine HTTP OPTIONS-Anfrage?" Um das zu beantworten, möchte ich wissen, warum Sie auf eine OPTIONS-Anfrage antworten möchten. Wer / was sendet Ihnen eine OPTIONS-Anfrage und warum? Viele öffentliche Server antworten mit einer Form von "Fehler" oder "nicht zulässig" (500, 501, 405). Wenn Sie sich also nicht in einer bestimmten Situation befinden, in der Ihre Kunden vernünftigerweise OPTIONS-Anfragen senden und nützliche / aussagekräftige Informationen zurück erwarten (z. B. WebDAV, CORS), möchten Sie wahrscheinlich antworten: "Tun Sie das nicht."

In Bezug auf Ihre Frage zur Anforderung "OPTIONEN / Konvertierung HTTP / 1.1": Es sei denn, Sie wissen, dass es einen Client Ihres Servers gibt, einen Client, der eine OPTIONEN-Anforderung an "/ Konvertierung" sendet und eine Antwort mit "Zulassen: KONVERTIEREN" erwartet "Die Antwort ist nein: Es wäre nicht sinnvoll, so zu antworten. Ich denke, dass die meisten Implementierungen, die OPTIONEN unterstützen und mit "Zulassen" antworten, mit Standard-HTTP-Methoden antworten.

Hier ist ein großartiger Artikel zum Thema .

Zusammenfassung: OPTIONEN sind sofort problematisch, da sie das Caching nicht unterstützen. Alternativen: Serverweite Metadaten: Probieren Sie bekannte URIs aus . Ressourcenspezifisch: Verwenden Sie einen Link-Header für die Antworten oder einen Link im Darstellungsformat für diese Ressource.

Wenn Sie eine Servicebeschreibung suchen, schauen Sie sich WADL oder RSDL an .

BEARBEITEN:

dotnetguy macht im folgenden Kommentar einen guten Punkt: OPTIONEN sind in bestimmten Kontexten (z. B. CORS) unbestreitbar wertvoll; Ich wollte auf keinen Fall etwas anderes vorschlagen.

Hawkeye Parker
quelle
4
Der Artikel ist gut und von und Autorität, aber siehe den Abschnitt "Warum verlässt HTTPbis dann OPTIONEN in" und Kommentare. Mit CORS sollte ein REST-System in der Lage sein, auf OPTIONEN zu reagieren, insbesondere wenn die APIs von einer JavaScript-basierten Webanwendung verwendet werden sollen. Es ist üblich, dass JS-Frameworks vor dem eigentlichen HTTP-Aufruf eine "Preflight" -Optionsanforderung auslösen.
Sudhanshu Mishra
Ich habe OPTIONS-Anfragen gesehen, als ich meinen (selbst geschriebenen) http-Server über macOS Finder ( mit Webdav ) verband.
Joe
8

Was ist eine HTTP OPTIONS-Anfrage?

Es ist eine Anforderung von dem Client zu wissen , was HTTP - Methoden der Server ermöglichen wird, wie GET, POSTetc.

Anfrage

Die Anfrage könnte folgendermaßen aussehen, wenn Sie nach den Optionen für eine bestimmte Ressource fragen:

OPTIONS /index.html HTTP/1.1

oder so, wenn Sie nach dem Server im Allgemeinen fragen:

OPTIONS * HTTP/1.1

Antwort

Die Antwort würde einen AllowHeader mit den zulässigen Methoden enthalten:

Allow: OPTIONS, GET, HEAD, POST

Warum empfängt der Server eine HTTP OPTIONS-Anforderung?

  • Einige REST-APIs benötigen es (aber wenn Sie die API definieren, wissen Sie das)
  • Browser senden es als "Preflight" -Anfragen an Server, um festzustellen, ob der Server CORS versteht
  • Angreifer senden es, um weitere Informationen über die API zu erhalten

Wie antworte ich auf eine HTTP OPTIONS-Anfrage?

  • Sie können mit einem AllowedHeader antworten und sogar Ihre API im Body dokumentieren .
  • Sie könnten mit zusätzlichen CORS-definierten Access-Control-Request-*Headern antworten .
  • Sie könnten mit 405 Method Not Allowedoder antworten 501 Not Implemented.

Wie höre ich auf, HTTP-OPTIONEN-Anfragen zu erhalten?

  • Wenn es von einem Browser kommt, aktualisieren Sie Ihre API so, dass sie nichts "Gefährliches" tut (wie PUToder DELETEoder POSTmit application/json). Führen Sie nur einfache Anfragen aus .

Siehe auch

Suragch
quelle