Как ответить на запрос HTTP OPTIONS?

84

OPTIONSПредположительно, метод HTTP используется для определения того, какие другие методы сервер поддерживает на данном ресурсе. Учитывая это, у меня есть два вопроса:

  • Как выглядит этот ответ? Я видел примеры со списками CSV в Public, Allowи даже Access-Control-Allow-Methodsзаголовки. Все ли они нужны? Какая разница? RFC 2616 , похоже, здесь не очень полезен.

  • Будет ли уместно использовать это для перечисления действий, которые ресурс поддерживает в среде, отличной от REST-API? Например, если my ConversionControllerподдерживает действие convert, будет ли иметь смысл такой ответ:

Запрос:

OPTIONS /conversion HTTP/1.1

Отклик:

HTTP/1.1 200 OK
...
Allow: CONVERT
...
FtDRbwLXw6
источник
2
Allow: CONVERT??
Pacerier

Ответы:

20

RFC 2616 определяет «Разрешить» ( http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.7 ). "Public" больше не используется. "Access-Control-Allow-Methods" определен в спецификации CORS (см. Http://www.w3.org/TR/cors/ ).

Джулиан Решке
источник
Спасибо за разъяснение. В случае CORS, должен как Allowи Access-Control-Allow-Methodsбыть отправлены, или только последний?
FtDRbwLXw6,
Я бы всегда возвращал «Разрешить», а это не особый случай CORS.
Джулиан Решке
6
А что насчет содержания? Может ли быть доступно содержимое тела?
CMCDragonkai
2
@CMCDragonkai Да, OPTIONSможет быть контент. Из RFC 2616: «Если запрос OPTIONS включает тело объекта (на что указывает наличие Content-Length или Transfer-Encoding), то тип носителя ДОЛЖЕН указываться полем Content-Type. Хотя эта спецификация не определяет при любом использовании такого тела будущие расширения HTTP могут использовать тело OPTIONS для выполнения более подробных запросов на сервере. Сервер, который не поддерживает такое расширение, МОЖЕТ отклонить тело запроса ».
епископ
Я считаю, что если вы хотите использовать CORS, требуются оба Allowи Access-Control-Allow-Methods. Первый указывает, какие методы поддерживаются в целом, а второй указывает, какие методы разрешены для запросов из разных источников. Например, можно разрешить GET, POST, PUTи DELETEдля своего собственного происхождения , но только позволяет GETи POSTдля перекрестного происхождения.
Микко Ранталайнен
8

В ответ на заголовок: «Как ответить на запрос HTTP OPTIONS?» Чтобы ответить на этот вопрос, я хотел бы знать, почему вы хотите ответить на запрос OPTIONS? Кто / что отправляет вам запрос OPTIONS и почему? Многие общедоступные серверы отвечают той или иной формой «ошибка» или «не разрешено» (500, 501, 405). Итак, если вы не находитесь в конкретной ситуации, когда ваши клиенты будут разумно отправлять запросы OPTIONS и ожидать обратно полезной / значимой информации (например, WebDAV, CORS), вы, вероятно, захотите ответить: «Не делайте этого».

Что касается вашего вопроса о запросе «OPTIONS / convert HTTP / 1.1»: если вы не знаете, что есть какой-то клиент вашего сервера, клиент, который отправит запрос OPTIONS на «/ conversion» и ожидает ответа с «Allow: CONVERT , "ответ - нет: не имело бы смысла так отвечать. Я думаю, что большинство реализаций, которые действительно поддерживают ОПЦИИ и отвечают «Разрешить», отвечают стандартными методами HTTP.

Вот отличная статья по этой теме .

Резюме: OPTIONS сразу вызывает проблемы, потому что он не поддерживает кеширование. Альтернативы: общесерверные метаданные: попробуйте известные URI . Для конкретного ресурса: попробуйте использовать заголовок Link в ответах или ссылку в формате представления для этого ресурса.

Наконец, если вам нужно описание услуги, взгляните на WADL или RSDL .

РЕДАКТИРОВАТЬ:

dotnetguy делает хорошую точку в комментариях ниже: OPTIONS, несомненно, ценный в определенных контекстах (например, CORS); Я, конечно, не хотел утверждать обратное.

Ястребиный глаз Паркер
источник
4
Статья хорошая и авторитетная, но см. Раздел «Почему HTTPbis затем оставляет OPTIONS?» И комментарии. С CORS система REST должна иметь возможность реагировать на ОПЦИИ, особенно если API-интерфейсы будут использоваться из веб-приложения на основе JavaScript. JS-фреймворки обычно запускают запрос опций «предпечатной проверки» перед фактическим HTTP-вызовом.
Судханшу Мишра
Я видел запросы OPTIONS, когда подключаю свой (самописный) http-сервер из macOS Finder ( с помощью Webdav ).
Джо
8

Что такое запрос HTTP OPTIONS?

Это запрос от клиента, чтобы узнать, какие HTTP-методы разрешит сервер, например GET, POSTи т. Д.

Запрос

Запрос может выглядеть так, когда спрашивают о параметрах для конкретного ресурса:

OPTIONS /index.html HTTP/1.1

или вот так, когда спрашивают о сервере в целом:

OPTIONS * HTTP/1.1

отклик

Ответ будет содержать Allowзаголовок с разрешенными методами:

Allow: OPTIONS, GET, HEAD, POST

Почему сервер получает запрос HTTP OPTIONS?

  • Некоторым REST API это необходимо (но если вы определяете API, вы должны это знать)
  • Браузеры отправляют его на серверы как «предварительно настроенные» запросы, чтобы узнать, понимает ли сервер CORS.
  • Злоумышленники отправляют его, чтобы получить дополнительную информацию об API.

Как ответить на запрос HTTP OPTIONS?

  • Вы можете ответить Allowedзаголовком и даже задокументировать свой API в теле.
  • Вы можете ответить дополнительными Access-Control-Request-*заголовками, определенными CORS .
  • Вы можете ответить 405 Method Not Allowedили 501 Not Implemented.

Как перестать получать запросы HTTP OPTIONS?

  • Если он исходит из браузера, обновите свой API, чтобы он не делал ничего «опасного» (например, PUTили DELETE, или POSTс помощью application/json). Выполняйте только простые запросы .

Смотрите также

Suragch
источник