web-dev-qa-db-fra.com

Téléchargement de fichiers à l'aide de la méthode GET

Comme nous le savons tous, le téléchargement de fichiers s'effectue le plus souvent à l'aide de la méthode POST. Alors, pourquoi la méthode GET ne peut-elle pas être utilisée à la place pour les téléchargements de fichiers? Existe-t-il une interdiction spécifique contre les téléchargements HTTP GET?

31
Pradip Kharbuja

Les requêtes GET peuvent contenir un corps d'entité

La RFC 2616 n'empêche pas un corps d'entité dans le cadre d'une demande GET. Ceci est souvent mal compris car PHP trouble les eaux avec ses mal nommés $_GET superglobale. $_GET techniquement n'a rien à voir avec la méthode de requête HTTP GET - ce n'est rien de plus qu'une liste de valeurs-clés de paramètres encodés en URL provenant de la chaîne de requête URI de requête. Vous pouvez accéder au $_GET array même si la demande a été faite via POST/PUT/etc. Bizarre, non? Ce n'est pas une très bonne abstraction, n'est-ce pas?

Pourquoi un corps d'entité GET est une mauvaise idée

Alors qu'est-ce que le spec dire sur la méthode GET ... bien:

En particulier, la convention a été établie que les méthodes GET et HEAD NE DEVRAIENT PAS avoir la signification de prendre une action autre que la récupération. Ces méthodes doivent être considérées comme "sûres".

Donc, l'important avec GET est de s'assurer que toute demande GET est sûre. Pourtant, l'interdiction est seulement "NE DEVRAIT PAS" ... techniquement, HTTP permet toujours à une requête GET d'entraîner une action qui n'est pas strictement basée sur "récupération."

Bien sûr, d'un point de vue sémantique, utiliser une méthode nommée GET pour effectuer une action autre que "récupérer" une ressource n'a pas beaucoup de sens non plus.

Quand un corps d'entité GET est complètement faux

Concernant l'idempotence, la spécification dit:

Les méthodes peuvent également avoir la propriété "idempotence" en ce que (à part les problèmes d'erreur ou d'expiration) les effets secondaires de N> 0 requêtes identiques sont les mêmes que pour une seule requête. Les méthodes GET, HEAD, PUT et DELETE partagent cette propriété.

Cela signifie qu'une méthode GET ne doit pas avoir des effets secondaires différents pour plusieurs demandes pour la même ressource. Ainsi, quel que soit le corps d'entité présent dans le cadre d'une demande GET, les effets secondaires doivent toujours être les mêmes. En termes simples, cela signifie que si vous envoyez un GET avec un corps d'entité 100 fois, le serveur ne peut pas créer 100 nouvelles ressources. Qu'elle soit envoyée une ou 100 fois, la demande doit avoir le même résultat. Cela limite considérablement l'utilité de la méthode GET pour l'envoi de corps d'entité.

En cas de doute, recourez toujours aux tests de sécurité/idempotence lors de l'évaluation de l'efficacité d'une méthode et des effets secondaires qui en résultent.

36
rdlowrey