¿Cómo responder a una solicitud de OPCIONES HTTP?

83

El OPTIONSmétodo HTTP supuestamente se usa para determinar qué otros métodos admite el servidor en un recurso determinado. Dado eso, tengo dos preguntas:

  • ¿Cómo se ve esta respuesta? He visto ejemplos con listas CSV en Public, Allowe incluso Access-Control-Allow-Methodscabeceras. ¿Son todos necesarios? ¿Cual es la diferencia? RFC 2616 no parece ser muy útil aquí.

  • ¿Sería apropiado usar esto para enumerar las acciones que admite un recurso en un entorno que no es de API REST? Por ejemplo, si my ConversionControllerapoya la acción convert, ¿tendría sentido una respuesta como esta?

Solicitud:

OPTIONS /conversion HTTP/1.1

Respuesta:

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

Respuestas:

20

RFC 2616 define "Permitir" ( http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.14.7 ). "Público" ya no está en uso. "Access-Control-Allow-Methods" se define en la especificación CORS (consulte http://www.w3.org/TR/cors/ ).

Julian Reschke
fuente
Gracias por la aclaración. En el caso de CORS, ¿ deben enviarse tanto el Allowcomo Access-Control-Allow-Methods, o solo el último?
FtDRbwLXw6
Siempre devolvería "Permitir", por lo tanto, no CORS en casos especiales.
Julian Reschke
6
¿Y el contenido? ¿Puede estar disponible el contenido corporal?
CMCDragonkai
2
@CMCDragonkai Sí, OPTIONSpuede tener contenido. De RFC 2616: "Si la solicitud OPTIONS incluye un cuerpo de entidad (como lo indica la presencia de Content-Length o Transfer-Encoding), el tipo de medio DEBE indicarse mediante un campo Content-Type. Aunque esta especificación no define cualquier uso de dicho cuerpo, las futuras extensiones de HTTP podrían utilizar el cuerpo OPTIONS para realizar consultas más detalladas en el servidor. Un servidor que no admita dicha extensión PUEDE descartar el cuerpo de la solicitud ".
obispo
Creo que ambos Allowy Access-Control-Allow-Methodsson necesarios si desea utilizar CORS. El primero especifica qué métodos son compatibles en general y el segundo especifica qué métodos están permitidos para solicitudes de origen cruzado. Por ejemplo, es posible permitir que GET, POST, PUTy DELETEpara su propio origen, sino que sólo permiten GETy POSTpara cross-origen.
Mikko Rantalainen
8

En respuesta al título: "¿Cómo responder a una solicitud de OPCIONES HTTP?" Para responder a eso, me gustaría saber por qué desea responder a una solicitud de OPCIONES. ¿Quién / qué le envía una solicitud de OPCIONES y por qué? Muchos servidores públicos responden con algún tipo de "error" o "no permitido" (500, 501, 405). Por lo tanto, a menos que se encuentre en una situación específica en la que sus clientes enviarán solicitudes OPTIONS de manera razonable y esperarán información útil / significativa (por ejemplo, WebDAV, CORS), probablemente desee responder con: "no hagas eso".

En cuanto a su pregunta sobre la solicitud "OPCIONES / conversión HTTP / 1.1": a menos que sepa que hay algún cliente de su servidor, un cliente que enviaría una solicitud OPCIONES a "/ conversión" y esperaría una respuesta con "Permitir: CONVERTIR , "la respuesta es no: no tendría sentido responder así. Creo que la mayoría de las implementaciones que hacen opciones de soporte y responder con "Permitir", responden con métodos HTTP estándar.

Aquí hay un gran artículo sobre el tema .

Resumen: OPTIONS es inmediatamente problemático porque no admite el almacenamiento en caché. Alternativas: metadatos de todo el servidor: pruebe URIs conocidos . Específico del recurso: intente usar un encabezado de enlace en sus respuestas, o un enlace en el formato de representación para ese recurso.

Por último, si lo que busca es una descripción de servicio, eche un vistazo a WADL o RSDL .

EDITAR:

dotnetguy hace un buen punto en el comentario a continuación: OPTIONS es innegablemente valioso en ciertos contextos (por ejemplo, CORS); Ciertamente no quise sugerir lo contrario.

Hawkeye Parker
fuente
4
El artículo es bueno, y tiene autoridad, pero consulte la sección "Por qué HTTPbis deja OPTIONS, entonces" y comentarios. Con CORS, un sistema REST debería poder responder a OPCIONES, especialmente si las API se van a utilizar desde una aplicación web basada en JavaScript. Es común que los frameworks JS activen una solicitud de opciones de "verificación previa" antes de la llamada HTTP real.
Sudhanshu Mishra
Vi solicitudes de OPCIONES cuando conecté mi servidor http (escrito por mí mismo) desde macOS Finder ( usando Webdav ).
Joe
7

¿Qué es una solicitud HTTP OPTIONS?

Es una solicitud del cliente para saber qué métodos HTTP del servidor permitirá, como GET, POST, etc.

Solicitud

La solicitud puede tener este aspecto cuando se pregunta acerca de las opciones para un recurso en particular:

OPTIONS /index.html HTTP/1.1

o así al preguntar por el servidor en general:

OPTIONS * HTTP/1.1

Respuesta

La respuesta contendría un Allowencabezado con los métodos permitidos:

Allow: OPTIONS, GET, HEAD, POST

¿Por qué el servidor recibe una solicitud de OPCIONES HTTP?

  • Algunas API REST lo necesitan (pero si está definiendo la API, lo sabrá)
  • Los navegadores lo envían a los servidores como solicitudes de "verificación previa" para ver si el servidor comprende CORS
  • Los atacantes lo envían para obtener más información sobre la API

¿Cómo responder a una solicitud de OPCIONES HTTP?

  • Podría responder con un Allowedencabezado e incluso documentar su API en el cuerpo.
  • Puede responder con Access-Control-Request-*encabezados adicionales definidos por CORS .
  • Puede responder con 405 Method Not Allowedo 501 Not Implemented.

¿Cómo dejo de recibir solicitudes de OPCIONES HTTP?

  • Si proviene de un navegador, actualice su API para que no haga nada "peligroso" (como PUTo DELETE, o POSTcon application/json). Realice solo solicitudes simples .

Ver también

Suragch
fuente