web-dev-qa-db-fra.com

http HEAD vs performance GET

Je suis en train de configurer un service Web REST) qui doit simplement répondre à OUI ou à NON, le plus rapidement possible.

Concevoir un service HEAD semble le meilleur moyen de le faire, mais j'aimerais savoir si je gagnerai vraiment du temps par rapport à une requête GET.

Je suppose que je gagne le flux de corps pour ne pas être ouvert/fermé sur mon serveur (environ 1 milliseconde?). Étant donné que le nombre d'octets à renvoyer est très faible, est-ce que je gagne du temps en transport, en nombre de paquets IP?

Merci d'avance pour votre réponse!

Edit:

Pour expliquer plus en détail le contexte:

  • J'ai un ensemble de REST exécutant certains processus, s'ils sont dans un état actif.
  • J'ai un autre service REST) indiquant l'état de tous ces premiers services.

Comme ce dernier service sera appelé très souvent par un très grand nombre de clients (un appel attendu toutes les 5 ms), je me demandais si l’utilisation de la méthode HEAD peut être une optimisation valable? Environ 250 caractères) sont retournés dans le corps de la réponse. HEAD méthode gagne au moins le transport de ces 250 caractères, mais quel est cet impact?

J'ai essayé de comparer la différence entre les deux méthodes (HEAD vs GET), en exécutant 1000 fois les appels, mais je ne vois aucun gain (<1 ms) ...

95
Asterius

Un URI RESTful doit représenter une "ressource" sur le serveur. Les ressources sont souvent stockées sous forme d'enregistrement dans une base de données ou dans un fichier sur le système de fichiers. À moins que la ressource ne soit volumineuse ou lente à récupérer sur le serveur, il est possible que vous ne voyiez pas de gain mesurable en utilisant HEAD au lieu de GET. Il se peut que la récupération des métadonnées ne soit pas plus rapide que la récupération de la ressource entière.

Vous pouvez implémenter les deux options et les comparer pour voir ce qui est plus rapide, mais plutôt que de micro-optimiser, je me concentrerais sur la conception de l'interface idéale REST. Une API propre REST a généralement plus de valeur à long terme qu'une API kludgey plus ou moins rapide. Je ne décourage pas l'utilisation de HEAD, je suggère simplement de ne l'utiliser que s'il s'agit du "bon" modèle.

Si les informations dont vous avez besoin sont réellement des métadonnées sur une ressource qui peuvent être bien représentées dans les en-têtes HTTP, ou pour vérifier si la ressource existe ou non, HEAD pourrait fonctionner correctement.

Par exemple, supposons que vous souhaitiez vérifier si la ressource 123 existe. Un 200 Signifie "oui" et un 404 Signifie "non":

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

HTTP/1.1 404 Not Found
[...]

Toutefois, si le "oui" ou le "non" de votre service REST fait partie de la ressource elle-même, et non des métadonnées, vous devez utiliser GET.

149
Andre D

J'ai trouvé cette réponse en cherchant la même question que celle demandée par le demandeur. J'ai aussi trouvé ceci sur http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html :

La méthode HEAD est identique à GET, sauf que le serveur NE DOIT PAS renvoyer de corps de message dans la réponse. La métainformation contenue dans les en-têtes HTTP en réponse à une demande HEAD DEVRAIT être identique à l'information envoyée en réponse à une demande GET. Cette méthode peut être utilisée pour obtenir des métainformations sur l'entité impliquée par la demande sans transférer le corps d'entité lui-même. Cette méthode est souvent utilisée pour tester la validité, l’accessibilité et les modifications récentes des liens hypertextes.

Il me semble que la bonne réponse à la question du demandeur est que cela dépend de ce que représente le protocole REST. Par exemple, dans mon cas particulier, mon protocole REST permet de récupérer des images assez volumineuses (comme dans plus de 10 Ko). Si je vérifie constamment un grand nombre de ces ressources et que je me sers des en-têtes de requête, il serait logique d'utiliser HEAD request, conformément aux recommandations de w3.org.

35
Charles Thomas

Je décourage fortement ce genre d'approche.

Un service RESTful doit respecter la sémantique des verbes HTTP. Le verbe GET est destiné à récupérer le contenu de la ressource, tandis que le verbe HEAD ne renvoie aucun contenu et peut être utilisé, par exemple, pour voir si une ressource a été modifiée, pour en connaître le contenu. taille ou son type, pour vérifier s’il existe, etc.

Et rappelez-vous: l'optimisation précoce est la racine de tous les maux.

12
Eric Citaire

Votre performance changera difficilement en utilisant une requête HEAD au lieu d’une requête GET.

En outre, lorsque vous souhaitez que le contenu soit conforme à REST et que vous souhaitiez obtenir des données, vous devez utiliser une demande GET au lieu d'une demande HEAD.

7
jabbink

GET va à la tête + le corps, HEAD ne va qu'à la tête. Cela ne devrait pas être une question d'opinion plus rapide. Je ne comprends pas les réponses précédentes plus haut. Si vous recherchez des informations META que d'aller pour HEAD, qui est destiné à cette fin.

5
Viktor Joras

Je ne comprends pas votre préoccupation concernant le "flux de corps étant ouvert/fermé". Le corps de la réponse sera sur le même flux que les en-têtes de la réponse http et ne créera PAS une deuxième connexion (qui est d'ailleurs de l'ordre de 3 à 6 ms).

Cela ressemble à une tentative d’optimisation très prématurée sur quelque chose qui ne fera pas une différence significative, voire mesurable. La vraie différence est la conformité avec REST en général, qui recommande d'utiliser GET pour obtenir des données ..

Ma réponse est NON, utilisez GET si cela vous semble judicieux. HEAD ne procure aucun gain de performances.

3
smassey

HEAD les requêtes sont identiques à GET les requêtes, sauf que le corps de la réponse est vide . Ce type de demande peut être utilisé lorsque vous ne souhaitez que des métadonnées sur un fichier, sans avoir à transporter toutes les données du fichier.

0
Shadab Ali

Vous pouvez facilement faire un petit test pour mesurer la performance vous-même. Je pense que la différence de performances serait négligeable, car si vous ne rentrez que "Y" ou "N" dans le corps, il s'agit d'un seul octet supplémentaire ajouté à un flux déjà ouvert.

J'irais aussi avec GET car c'est plus correct. Vous n'êtes pas censé renvoyer de contenu dans les en-têtes HTTP, mais uniquement des métadonnées.

0
AshleysBrain