http HEAD vs OBTENER rendimiento


Estoy configurando un servicio web REST que solo necesita responder SÍ o NO, lo más rápido posible.

Diseñar un servicio HEAD parece la mejor manera de hacerlo, pero me gustaría saber si realmente ganaré algo de tiempo en lugar de hacer una solicitud GET.

Supongo que gano el flujo de cuerpo para no estar abierto / cerrado en mi servidor (aproximadamente 1 milisegundo?). Dado que la cantidad de bytes a devolver es muy baja, ¿gano tiempo en el transporte, en el número de paquete IP?

Gracias de antemano por su la respuesta!

Editar:

Para explicar más el contexto:

  • Tengo un conjunto de servicios REST ejecutando algunos procesos, si están en un estado activo.
  • Tengo otro servicio REST indicando el estado de todos estos primeros servicios.

Dado que ese último servicio será llamado muy a menudo por un conjunto muy grande de clientes (se espera una llamada cada 5 ms), me preguntaba si el uso de un método HEAD puede ser una optimización valiosa. Cerca de 250 caracteres se devuelven en el cuerpo de respuesta. Método de cabeza al menos ganar el transporte de estos 250 caracteres, pero ¿cuál es ese impacto?

Traté de comparar la diferencia entre los dos métodos (HEAD vs GET), ejecutando 1000 veces las llamadas, pero no veo ninguna ganancia (

Author: John Hoven, 2013-05-14

7 answers

Un URI RESTful debe representar un "recurso" en el servidor. Los recursos a menudo se almacenan como un registro en una base de datos o un archivo en el sistema de archivos. A menos que el recurso sea grande o sea lento para recuperar en el servidor, es posible que no vea una ganancia medible al usar HEAD en lugar de GET. Podría ser que recuperar los metadatos no sea más rápido que recuperar todo el recurso.

Puede implementar ambas opciones y compararlas para ver cuál es más rápido, pero en lugar de micro-optimizar, me centraría en el diseño de la interfaz REST ideal. Una API REST limpia suele ser más valiosa a largo plazo que una API kludgey que puede o no ser más rápida. No estoy desalentando el uso de HEAD, solo sugiriendo que solo lo uses si es el diseño "correcto".

Si la información que necesita realmente son metadatos sobre un recurso que se puede representar bien en las cabeceras HTTP, o para comprobar si el recurso existe o no, HEAD podría funcionar bien.

Para ejemplo, supongamos que desea comprobar si existe el recurso 123. A 200 significa " sí "y a 404 significa"no":

HEAD /resources/123 HTTP/1.1
[...]

HTTP/1.1 404 Not Found
[...]

Sin embargo, si el "sí" o "no" que desea de su servicio REST es una parte del recurso en sí, en lugar de metadatos, debe usar GET.

 118
Author: Andre D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-21 00:02:16

Encontré esta respuesta al buscar la misma pregunta que el solicitante hizo. También encontré esto en http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html:

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 implicada por la solicitud sin transferir la entidad-organismo en sí. Este método se usa a menudo para probar la validez, accesibilidad y modificación reciente de los enlaces de hipertexto.

Me parece que la respuesta correcta a la pregunta del solicitante es que depende de lo que representa el protocolo REST. Por ejemplo, en mi caso particular, mi protocolo REST se utiliza para recuperar imágenes bastante grandes (como en más de 10K). Si tengo un gran número de tales recursos que se comprueban sobre una base constante, y dado que hago uso de las cabeceras de la petición, entonces tendría sentido utilizar la petición de la CABEZA, por w3.org recomendaciones.

 29
Author: Charles Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-16 23:35:57

Desaconsejo firmemente este tipo de enfoque.

Un servicio RESTful debe respetar la semántica de los verbos HTTP. El verbo GET está destinado a recuperar el contenido del recurso, mientras que el verbo HEAD no devolverá ningún contenido y se puede usar, por ejemplo, para ver si un recurso ha cambiado, para saber su tamaño o su tipo, para verificar si existe, y así sucesivamente.

Y recuerda : la optimización temprana es la raíz de todo mal.

 10
Author: Eric Citaire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-01 20:19:22

Su rendimiento apenas cambiará al usar una solicitud HEAD en lugar de una solicitud GET.

Además, cuando desee que sea REST-ful y desee obtener datos, debe usar una solicitud GET en lugar de una solicitud HEAD.

 7
Author: jabbink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-16 16:37:42

No entiendo su preocupación de que la 'corriente del cuerpo esté abierta/cerrada'. El cuerpo de la respuesta estará sobre el mismo flujo que los encabezados de respuesta http y NO creará una segunda conexión (que por cierto está más en el rango de 3-6ms).

Esto parece un intento de optimización muy maduro en algo que simplemente no hará una diferencia significativa o incluso medible. La verdadera diferencia es la conformidad con REST en general, que recomienda usar GET to get data..

Mi respuesta es NO, usa GET si tiene sentido, no hay ganancia de rendimiento usando HEAD.

 3
Author: smassey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-22 13:17:35

GET fetches head + body, HEAD fetches head only. No debería ser cuestión de opinión cuál es más rápido. Yo no undestand las respuestas votadas arriba. Si usted está buscando META información que ir a la CABEZA, que está destinado para este propósito.

 3
Author: Viktor Joras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-26 11:38:14

Usted podría hacer fácilmente una pequeña prueba para medir el rendimiento usted mismo. Creo que la diferencia de rendimiento sería negligible, porque si solo devuelve 'Y ' o' N ' en el cuerpo, es un solo byte adicional agregado a una transmisión ya abierta.

También iría con GET ya que es más correcto. Se supone que no debe devolver contenido en encabezados HTTP, solo metadatos.

 0
Author: AshleysBrain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-18 14:00:35