PUT vs. POST pour les fichiers téléchargés api RESTful à construire en utilisant Zend Framework

Je construis une api RESTful en utilisant Zend Framework via le Zend_Rest_Route. Pour les fichiers téléchargés, dois-je utiliser PUT ou POST pour gérer le processus? J’essaie d’être aussi cohérent que possible avec la définition des verbes REST. S’il vous plaît se référer à: PUT ou POST: Le rest de l’histoire

La façon dont je comprends cela est que je devrais utiliser PUT si et seulement si je mets à jour le contenu complet de la ressource spécifiée. Je vais devoir connaître l’URL exacte à mettre à. D’un autre côté, je devrais utiliser POST si j’envoie une commande au serveur pour créer un subordonné de la ressource spécifiée, en utilisant un algorithme côté serveur.

Supposons qu’il s’agisse d’une api REST pour le téléchargement d’images. Cela signifie-t-il que je devrais utiliser POST si le serveur doit manipuler les fichiers image (c.-à-d. Créer des vignettes, redimensionner, etc.); et utilisez PUT si je sauvegarde simplement le fichier image brut sur le serveur?

Si j’utilise PUT pour gérer le téléchargement de fichiers, le processus devrait-il être le suivant:

  1. L’utilisateur envoie une requête GET pour récupérer l’URL spécifique du fichier vers lequel effectuer la conversion.
  2. Ensuite, l’utilisateur envoie une demande PUT à l’URL à partir de la réponse GET. Le fichier en cours de téléchargement est brut au fur et à mesure du téléchargement de l’utilisateur.

Je suis tout à fait nouveau à ce genre de choses; alors j’espère que j’ai du sens ici …

Si vous connaissez le “meilleur” moyen de le faire, n’hésitez pas à commenter également.

Il semble y avoir beaucoup de malentendu ici. PUT versus POST n’est pas vraiment une question de remplacer ou de créer, mais plutôt d’idempotence et de dénomination des ressources.

PUT est une opération idempotente. Avec lui, vous donnez le nom d’une ressource et d’une entité à placer en tant que contenu de cette ressource (éventuellement avec des ajouts générés par le serveur). De manière cruciale, effectuer l’opération deux fois de suite devrait aboutir à la même chose que si elle avait été effectuée une seule fois ou 20 fois, pour une définition assez vague de «la même chose» (il n’est pas nécessaire qu’elle soit octet par octet). octet identique, mais les informations fournies par l’utilisateur doivent être intactes). Vous ne voudriez jamais qu’un PUT provoque le déclenchement d’une transaction financière.

POST est une opération non idempotente. Vous n’avez pas besoin de donner le nom de la ressource que vous souhaitez créer (ni de créer un POST; cela pourrait dédupliquer les ressources si vous le souhaitiez). POST est souvent utilisé pour implémenter «créer une ressource avec un nom nouvellement créé et me dire quel est le nom» – le manque d’idempotence impliqué par «nouveau nom» correspond à cela. Lorsqu’une nouvelle ressource est créée, le renvoi du localisateur pour la ressource dans un en-tête Location est tout à fait la bonne chose à faire.

Maintenant, si vous prenez la position politique selon laquelle les clients ne doivent jamais créer de noms de ressources, vous obtiendrez alors POST parfaitement adapté à la création (même s’il pourrait théoriquement faire n’importe quoi en fonction de l’entité fournie) et PUT comment faire la mise à jour. Pour de nombreuses applications RESTful, cela a beaucoup de sens, mais pas toutes; Si le modèle présenté à l’utilisateur était un système de fichiers, le fait que l’utilisateur fournisse le nom de la ressource est très logique et PUT devient l’opération de création principale (et POST devient délégué à des tâches moins courantes comme créer un répertoire vide et ainsi de suite) WebDAV réduit encore le besoin de POST).

Le résumé: Ne pensez pas en termes de création / mise à jour, mais plutôt en termes de qui crée les noms de ressources et quelles opérations sont idempotentes. PUT est vraiment create-or-update, et POST est vraiment tout-ce qui ne devrait pas être répété-bon gré mal gré.

Pour le téléchargement de fichiers, à moins de remplacer une ressource existante, utilisez définitivement POST.

Dans REST, POST doit créer de nouvelles ressources, PUT pour remplacer des ressources existantes, GET pour récupérer des ressources et DELETE pour supprimer des ressources.

Source: http://en.wikipedia.org/wiki/Representational_state_transfer#RESTful_web_services

REST n’est pas une norme, donc cela peut facilement se transformer en bataille religieuse. Les standards AtomPub et OData qui sont considérés comme “RESTful” sont d’accord sur cela: POST = création pendant que PUT = mises à jour

La réponse simple est que vous devriez utiliser PUT au lieu de POST dans votre cas puisque vous remplacerez l’intégralité du contenu du fichier. Jetez un oeil à PUT vs POST

Je vais devoir connaître l’URL exacte de PUT to

Non, vous n’avez pas besoin de connaître l’URL de PUT, c’est-à-dire que l’URI PUT n’a pas besoin d’être présent avant l’opération PUT. Si la ressource n’existe pas, la ressource est créée. Si la ressource est déjà présente, la ressource est remplacée par la nouvelle représentation.

Pour citer l’article lié:

PUT met une page à une URL spécifique. S’il y a déjà une page, elle est remplacée totalement. S’il n’y a pas de page, un nouveau est créé. Cela signifie que c’est comme un DELETE suivi d’un insert d’un nouvel enregistrement avec la même clé primaire