Métodos API RESTful; CABEZAL Y OPCIONES

8 minutos de lectura

avatar de usuario
Dan Lugg

Estoy escribiendo un módulo API RESTful para una aplicación en PHP, y estoy un poco mezclado con los verbos HEAD y OPTIONS.

  • OPTIONS  ¿Se utiliza para recuperar los verbos HTTP disponibles para un recurso determinado?
  • HEAD ¿Se utiliza para determinar si un recurso determinado está disponible?

Si alguien pudiera aclarar* estos verbos, sería muy apreciado.

* La aclaración fue con respecto a las arquitecturas API RESTful que reutilizan los verbos HTTP. Desde entonces me he dado cuenta de que ambos HEAD y OPTIONS debería no ser rediseñado y, en cambio, comportarse de manera predecible como debería hacerlo cualquier aplicación HTTP. Oh, cómo crecemos en 2 años.

  • probablemente porque las especificaciones HTTP están disponibles en la web.

    – Gordon

    12 de julio de 2011 a las 16:23


  • @Gordon: es justo, y aunque entiendo que los servicios de API RESTful están destinados a aprovechar las especificaciones HTTP existentes, supongo que supuse alguna desviación parcial para los detalles de implementación. Culpa mía.

    – Dan Lug

    12 de julio de 2011 a las 16:32

  • Las especificaciones para casi cualquier cosa están disponibles en la web. Las preguntas sobre SO son para aclaraciones más allá de la documentación. Esto encaja con eso.

    –Andrew Ensley

    25 de septiembre de 2012 a las 14:42

avatar de usuario
Yuriy Kvartsyanyy

OPTIONS método devuelve información sobre API (métodos/tipo de contenido)

HEAD método devuelve información sobre recurso (versión/longitud/tipo)

Respuesta del servidor

OPCIONES

HTTP/1.1 200 OK
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2013 10:24:43 GMT
Content-Length: 0

CABEZA

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2013 10:12:29 GMT
ETag: "780602-4f6-4db31b2978ec0"
Last-Modified: Thu, 25 Apr 2013 16:13:23 GMT
Content-Length: 1270
  • OPTIONS Identificar qué métodos HTTP admite un recurso, por ejemplo, ¿podemos ELIMINARLO o actualizarlo a través de PUT?
  • HEAD Comprobar si un recurso ha cambiado. Esto es útil cuando se mantiene una versión en caché de un recurso
  • HEAD Recuperar metadatos sobre el recurso, por ejemplo, su tipo de medio o su tamaño, antes de realizar una recuperación posiblemente costosa
  • HEAD, OPTIONS Probar si un recurso existe y es accesible. Por ejemplo, validar enlaces enviados por usuarios en una aplicación

Aquí es un artículo agradable y conciso sobre cómo HEAD y OPTIONS encajan en la arquitectura RESTful.

  • Gran respuesta, lástima que pagará la multa por llegar tarde a la fiesta. La respuesta aceptada copiada y pegada ni siquiera comienza a abordar específicamente el lugar de estos verbos en una arquitectura RESTful.

    –Todd Menier

    9 de diciembre de 2017 a las 17:29

  • Tu enlace está muerto. Aquí está su última instantánea: web.archive.org/web/20160528151316/https://…

    – kolobok

    13 de diciembre de 2018 a las 11:01

avatar de usuario
desaliñado

Según: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

9.2 OPCIONES

El método OPCIONES representa una solicitud de información sobre las opciones de comunicación disponibles en la cadena de solicitud/respuesta identificada por la URI de solicitud. Este método permite que el cliente determine las opciones y/o requisitos asociados con un recurso, o las capacidades de un servidor, sin implicar una acción de recurso o iniciar una recuperación de recurso.

Las respuestas a este método no se pueden almacenar en caché.

Si la solicitud de OPCIONES incluye un cuerpo de entidad (como lo indica la presencia de Content-Length o Transfer-Encoding), entonces el tipo de medio DEBE indicarse mediante un campo Content-Type. Aunque esta especificación no define ningún uso para dicho cuerpo, las futuras extensiones de HTTP podrían usar el cuerpo de OPCIONES para realizar consultas más detalladas en el servidor. Un servidor que no admita dicha extensión PUEDE descartar el cuerpo de la solicitud.

Si Request-URI es un asterisco (“*”), la solicitud OPTIONS está destinada a aplicarse al servidor en general en lugar de a un recurso específico. Dado que las opciones de comunicación de un servidor generalmente dependen del recurso, la solicitud “*” solo es útil como método de tipo “ping” o “sin operación”; no hace nada más que permitir que el cliente pruebe las capacidades del servidor. Por ejemplo, esto se puede usar para probar un proxy para el cumplimiento de HTTP/1.1 (o la falta del mismo).

Si Request-URI no es un asterisco, la solicitud OPTIONS se aplica solo a las opciones que están disponibles cuando se comunica con ese recurso.

Una respuesta 200 DEBERÍA incluir cualquier campo de encabezado que indique características opcionales implementadas por el servidor y aplicables a ese recurso (por ejemplo, Permitir), posiblemente incluyendo extensiones no definidas por esta especificación. El cuerpo de la respuesta, si lo hay, DEBE incluir también información sobre las opciones de comunicación. El formato de dicho cuerpo no está definido por esta especificación, pero podría definirse mediante futuras extensiones de HTTP. La negociación de contenido PUEDE utilizarse para seleccionar el formato de respuesta adecuado. Si no se incluye ningún cuerpo de respuesta, la respuesta DEBE incluir un campo de longitud de contenido con un valor de campo de “0”.

El campo de encabezado de solicitud Max-Forwards PUEDE usarse para apuntar a un proxy específico en la cadena de solicitud. Cuando un proxy recibe una solicitud de OPCIONES en un URL absoluto para el cual se permite el reenvío de solicitudes, el proxy DEBE buscar un campo Max-Forwards. Si el valor del campo Max-Forwards es cero (“0”), el proxy NO DEBE reenviar el mensaje; en cambio, el proxy DEBERÍA responder con sus propias opciones de comunicación. Si el valor del campo Max-Forwards es un número entero mayor que cero, el proxy DEBE disminuir el valor del campo cuando reenvía la solicitud. Si no hay un campo Max-Forwards presente en la solicitud, entonces la solicitud reenviada NO DEBE incluir un campo Max-Forwards.

9.4 CABEZA

El método HEAD es idéntico a GET excepto que el servidor NO DEBE devolver un cuerpo de mensaje en la respuesta. La metainformación contenida en los encabezados HTTP en respuesta a una solicitud HEAD DEBE ser idéntica a la información enviada en respuesta a una solicitud GET. Este método se puede utilizar para obtener metainformación sobre la entidad implícita en la solicitud sin transferir el propio cuerpo de la entidad. Este método se utiliza a menudo para probar la validez, accesibilidad y modificación reciente de los enlaces de hipertexto.

La respuesta a una solicitud HEAD PUEDE almacenarse en caché en el sentido de que la información contenida en la respuesta PUEDE usarse para actualizar una entidad previamente almacenada en caché de ese recurso. Si los nuevos valores de campo indican que la entidad almacenada en caché difiere de la entidad actual (como lo indicaría un cambio en Content-Length, Content-MD5, ETag o Last-Modified), entonces el caché DEBE tratar la entrada de caché como obsoleta.

  • Gracias @sdolgy por la cotización completa; sin embargo, en la práctica hacer (debería) muchos módulos API RESTful exitosos se adhieren a todos estos estándares HTTP, o hay un aceptable delgado respuesta para estas operaciones? No por pereza, sino simplemente por curiosidad; Probablemente implementaré todo lo necesario para adherirme.

    – Dan Lug

    12 de julio de 2011 a las 6:05


  • si está creando el suyo propio, lo que supongo que es así, debe tratar de mantener cierta alineación con los estándares documentados para hacer su vida más fácil… y la de las personas que consumen su api… no siga a Microsoft. RFC es una buena cosa para alinearse con

    – sdolgy

    12 de julio de 2011 a las 6:08

  • Gracias @sdolgy. Habiendo informado al documento vinculado, noté al final el CONNECT verbo. ¿Sería una mala elección consumir ese método para la autenticación RESTful?

    – Dan Lug

    12 de julio de 2011 a las 6:14


  • No estoy seguro de que ese fuera el propósito previsto “Esta especificación reserva el nombre del método CONNECT para usar con un proxy que puede cambiar dinámicamente a ser un túnel (por ejemplo, túneles SSL [44]). “… puede ser útil publicar otra pregunta en uno de los sitios de stackexchange.com al respecto…

    – sdolgy

    12 de julio de 2011 a las 6:17

  • @DanLugg Es posible que su aplicación no esté utilizando CONNECT en una forma de tunelización SSL, pero imagine lo que sucedería si un consumidor de su aplicación tuviera un proxy que implementara CONNECT en la forma en que se especificó en el RFC, es posible que las solicitudes no se transfieran a su aplicación.

    – Steve Buzonas

    7 mayo 2014 a las 22:58

OPTIONS le dice cosas como “Qué métodos están permitidos para este recurso”.

HEAD obtiene el encabezado HTTP que obtendría si hiciera una solicitud GET, pero sin el cuerpo. Esto le permite al cliente determinar la información de almacenamiento en caché, qué tipo de contenido se devolverá, qué código de estado se devolverá. La disponibilidad es sólo una pequeña parte de ella.

  • Gracias @Quentin; OPTIONS fue lo que pensé, y dicha implementación será fácil con mi enfoque actual. Según la cita RFC de sdolgy, OPTIONS no define ningún estándar en el formato. ¿Se supone que el formato de respuesta es el mismo que el de otras respuestas? (p.ej; JSON, XML, etc)

    – Dan Lug

    12 de julio de 2011 a las 6:08


  • @Tomcat Citando el RFC: “La negociación de contenido PUEDE usarse para seleccionar el formato de respuesta apropiado”. En otras palabras: la respuesta debe ser lo que solicitó la Solicitud en el encabezado.

    – Gordon

    12 de julio de 2011 a las 7:36


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad