Jak odpowiedzieć na żądanie HTTP OPTIONS?

84

Metoda HTTP OPTIONSma służyć do określenia, jakie inne metody serwer obsługuje na danym zasobie. W związku z tym mam dwa pytania:

  • Jak wygląda ta odpowiedź? Widziałem przykłady z list CSV Public, Allowa nawet Access-Control-Allow-Methodsnagłówków. Czy wszystkie są potrzebne? Co za różnica? RFC 2616 nie wydaje się być tutaj zbyt pomocne.

  • Czy należałoby użyć tego do wyświetlenia akcji obsługiwanych przez zasób w środowisku innym niż REST-API? Na przykład, jeśli my ConversionControllerpopiera działanie convert, czy taka odpowiedź miałaby sens:

Żądanie:

OPTIONS /conversion HTTP/1.1

Odpowiedź:

HTTP/1.1 200 OK
...
Allow: CONVERT
...
FtDRbwLXw6
źródło
2
Allow: CONVERT??
Pacerier,

Odpowiedzi:

20

RFC 2616 definiuje „Zezwalaj” ( http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.7 ). „Publiczny” nie jest już używany. „Access-Control-Allow-Methods” jest zdefiniowane w specyfikacji CORS (patrz http://www.w3.org/TR/cors/ ).

Julian Reschke
źródło
Dziękuję za wyjaśnienie. W przypadku CORS, Allowczy Access-Control-Allow-Methodsnależy wysłać zarówno i , czy tylko to drugie?
FtDRbwLXw6
Zawsze zwracałbym „Zezwalaj”, a więc nie dotyczy to specjalnych przypadków CORS.
Julian Reschke
6
A co z treścią? Czy zawartość ciała może być dostępna?
CMCDragonkai
2
@CMCDragonkai Tak, OPTIONSmoże zawierać treść. Z RFC 2616: „Jeśli żądanie OPTIONS zawiera treść jednostki (na co wskazuje obecność Content-Length lub Transfer-Encoding), wówczas typ nośnika MUSI być wskazany w polu Content-Type. Chociaż ta specyfikacja nie definiuje jakiekolwiek użycie takiej treści, przyszłe rozszerzenia HTTP mogą używać treści OPTIONS do wykonywania bardziej szczegółowych zapytań na serwerze. Serwer, który nie obsługuje takiego rozszerzenia, MOŻE odrzucić treść żądania. "
biskup
Uważam, że oba Allowi Access-Control-Allow-Methodssą wymagane, jeśli chcesz używać CORS. Pierwsza określa, które metody są ogólnie obsługiwane, a druga określa, które metody są dozwolone w przypadku żądań między źródłami. Na przykład, można pozwolić GET, POST, PUTi DELETEdla własnego pochodzenia, ale tylko umożliwić GETi POSTna przekroju pochodzenia.
Mikko Rantalainen
8

W odpowiedzi na tytuł: „Jak odpowiedzieć na żądanie HTTP OPTIONS?” Aby odpowiedzieć na to pytanie, chciałbym wiedzieć, dlaczego chcesz odpowiedzieć na żądanie OPTIONS? Kto / co wysyła Ci prośbę o OPCJE i dlaczego? Wiele serwerów publicznych odpowiada jakimś rodzajem „błędu” lub „niedozwolonego” (500, 501, 405). Tak więc, jeśli nie jesteś w konkretnej sytuacji, w której Twoi klienci będą rozsądnie wysyłać żądania OPCJI i oczekiwać przydatnych / znaczących informacji z powrotem (np. WebDAV, CORS), prawdopodobnie chcesz odpowiedzieć: „nie rób tego”.

Jeśli chodzi o Twoje pytanie dotyczące żądania „OPCJE / konwersja HTTP / 1.1”: chyba że wiesz, że jest jakiś klient Twojego serwera, klient, który wyśle ​​żądanie OPCJI do „/ konwersja” i oczekuje odpowiedzi „Zezwalaj: KONWERTUJ” , "odpowiedź brzmi nie: nie miałoby sensu odpowiadać w ten sposób. Myślę, że większość wdrożeń że zrobić opcji pomocy i odpowiedzieć „Zezwalaj”, odpowie standardowych metod HTTP.

Oto świetny artykuł na ten temat .

Podsumowanie: OPTIONS jest natychmiast problematyczne, ponieważ nie obsługuje buforowania. Alternatywy: metadane dla całego serwera: wypróbuj dobrze znane identyfikatory URI . Specyficzne dla zasobu: spróbuj użyć nagłówka Link w odpowiedziach lub linku w formacie reprezentacji dla tego zasobu.

Na koniec, jeśli szukasz opisu usługi, spójrz na WADL lub RSDL .

EDYTOWAĆ:

dotnetguy zwraca uwagę w poniższym komentarzu: OPCJE są niezaprzeczalnie wartościowe w niektórych kontekstach (np. CORS); Z pewnością nie chciałem sugerować inaczej.

Hawkeye Parker
źródło
4
Artykuł jest dobry i według autorytetu, ale zobacz sekcję „Dlaczego HTTPbis opuszcza OPCJE w, to” i komentarze. Dzięki CORS system REST powinien być w stanie odpowiedzieć na OPCJE, zwłaszcza jeśli interfejsy API mają być używane z aplikacji internetowej opartej na JavaScript. Struktury JS często uruchamiają żądanie opcji „inspekcji wstępnej” przed rzeczywistym wywołaniem HTTP.
Sudhanshu Mishra
Widziałem żądania OPCJI, kiedy podłączam mój (napisany przez siebie) serwer http z macOS Finder ( używając Webdav ).
Joe
8

Co to jest żądanie HTTP OPTIONS?

Jest to żądanie od klienta, aby wiedzieć, jakie metody HTTP serwer pozwoli, jak GET, POSTitp

Żądanie

Żądanie może wyglądać tak, gdy pyta się o opcje dla określonego zasobu:

OPTIONS /index.html HTTP/1.1

lub w ten sposób, pytając ogólnie o serwer:

OPTIONS * HTTP/1.1

Odpowiedź

Odpowiedź zawierałaby Allownagłówek z dozwolonymi metodami:

Allow: OPTIONS, GET, HEAD, POST

Dlaczego serwer otrzymuje żądanie HTTP OPTIONS?

  • Niektóre interfejsy API REST tego potrzebują (ale jeśli definiujesz interfejs API, wiesz o tym)
  • Przeglądarki wysyłają go do serwerów jako żądania „wstępnie sprawdzone”, aby sprawdzić, czy serwer rozumie mechanizm CORS
  • Atakujący wysyłają go, aby uzyskać więcej informacji o API

Jak odpowiedzieć na żądanie HTTP OPTIONS?

  • Możesz odpowiedzieć Allowednagłówkiem, a nawet udokumentować swój interfejs API w treści.
  • Możesz odpowiedzieć, dodając dodatkowe Access-Control-Request-*nagłówki zdefiniowane przez CORS .
  • Możesz odpowiedzieć za pomocą 405 Method Not Allowedlub 501 Not Implemented.

Jak mogę przestać otrzymywać żądania HTTP OPTIONS?

  • Jeśli pochodzi z przeglądarki, zaktualizuj interfejs API, aby nie robił niczego „niebezpiecznego” (jak PUTlub DELETElub POSTz application/json). Wykonuj tylko proste żądania .

Zobacz też

Suragch
źródło