J'ai une opération d'impression à effectuer pour mes documents clients. J'ai également besoin des autres opérations standard, comme ajouter, mettre à jour, supprimer. donc j'ai:
- Pour créer un nouveau client:
URI = / customer / {id}, type = POST, Methodname = CreateCustomer () - Pour la mise à jour:
URI: / customer / {id}, type = PUT, method = UpdateCstomer () - Pour Delete customer:
URI = / customer / {id}, type = DELETE, Methodname = DeleteCustomer () - Pour View:
URI: / customer / {id}, tapez = GET, method = GetCustomer ()
Maintenant, si j'ai besoin d'imprimer un document pour ce client, j'ai besoin d'une fonction d'impression. Mon URI peut ressembler à ceci: / customer / {id}, type = POST, method = PrintCustomer (). Mais j'ai utilisé ce type URI et POST pour CreateCustomer. Je voulais que l'URI ressemble à ceci: / customer / Print / {id}, type = POST, method = PrintCustomer ().
Mais je ne peux pas avoir le verbe "Imprimer" dans mon URI. Quelle est la meilleure façon de procéder? J'ai pensé à / client / document / {id} comme l'URI ... mais je vais rencontrer le même problème. J'aurais les opérations CRUD sur le "document". Donc, encore une fois, je suis à court de ce que j'utiliserais pour "imprimer". S'il vous plaît donnez votre avis.
POST /customers/123/print
c'est une chose valable à faire.Réponses:
POST
ne signifie pas "créer", cela signifie "processus". Vous pouvez créer une nouvelle ressource en publiant une demande appropriée sur une ressource existante (c'est-à-dire publier/customers
pour créer un nouveau client). Mais vous pouvez également utiliserPOST
pour remplir toutes les autres actions qui ne correspondent pas à un paradigme CRUD soigné.Dans le cas de l'impression, vous devez considérer l'acte d'imprimer comme une ressource elle-même. Vous demandez au système de créer un "travail d'impression" pour vous. Cela signifie que vous pouvez avoir une
prints/
ressource qui sert de conteneur pour toutes les impressions demandées. Lorsque vous souhaitez imprimer quelque chose, vousPOST
un document à cette ressource qui contient toutes les informations sur l'impression que vous souhaitez créer, en identifiant les ressources que vous souhaitez imprimer avec des liens vers elles.En tant que document JSON, il pourrait ressembler à ceci:
De toute évidence, vous devez personnaliser cela pour qu'il corresponde à ce que vous voulez faire. L'essentiel est que vous identifiez d'autres ressources à imprimer en spécifiant leur URL.
En réponse à la demande, vous pouvez simplement retourner un
200 OK
ou un204 No-Content
et le traiter comme un processus de tir et d'oubli. Cependant, si vous souhaitez l'améliorer, vous pouvez retourner201 Created
et spécifier l'URL du travail d'impression nouvellement créé, par exemple/prints/12345
.Un utilisateur peut alors effectuer une
GET
sur la ressource pour voir l'état de son travail d'impression (en attente, en cours, etc.), ou peut demander l'annulation du travail en émettant unDELETE
.Une fois que vous reformulez le problème en termes de ressources, la conception RESTful devrait venir naturellement et vous donner la possibilité de vous étendre et de vous améliorer d'une manière que vous n'avez peut-être pas immédiatement envisagée.
la source
J'ai fait ça avant. Pour imprimer un document, je renvoie simplement une version pdf d'une ressource. Le client doit seulement envoyer une demande GET pour la ressource avec Accept header application / pdf.
Cela évite également de créer un nouvel URI pour une ressource temporaire comme un travail d'impression. L'utilisation de l'en-tête HTTP fait également partie de REST et garde l'URI propre.
la source
Ajoutez simplement un paramètre au GET de l'URI actuel
Il est assez typique d'utiliser un URI pour plusieurs actions.
Si vous parlez de la même ressource mais d'une action différente, vous la définiriez comme paramètre.
/ client / {id}? print = true
Ensuite, lorsque vous définissez votre méthode GET, vous détectez la présence du paramètre d'impression et le gérez différemment.
REST est défini de la manière suivante:
GET, d'autre part, est destiné à être utilisé de plusieurs manières car il existe généralement de nombreuses formes différentes qu'une ressource peut être récupérée. C'est également pourquoi les requêtes GET sont représentées sous la forme d'une chaîne de requête. Si vous travailliez avec une ressource de base de données, vous récupéreriez littéralement une vue via une requête, mais REST est intentionnellement abstrait à un niveau supérieur car il est conçu pour gérer de nombreux types de ressources différents.
La spécification REST est assez avant-gardiste, même si les API ne commencent à l'utiliser que récemment.
Si vous souhaitez en savoir plus sur les protocoles REST, je vous suggère fortement de lire " Haters Gonna Hate HATEOAS ".
Mise à jour:
@Shauna a souligné un trou intéressant dans mon raisonnement. Il n'y a pas de vraie bonne façon et de nombreuses formes sont considérées comme acceptables. J'y ai réfléchi un peu plus et puisque votre utilisation prévue est de transformer les données en une représentation différente, il est logique de définir la transformation comme un nouveau type MIME.
Par exemple, vous pouvez représenter l'URI comme:
Où vous pouvez définir la réponse Content-Type sur text / html + print. De cette façon, vous auriez également la possibilité de définir plus de transformations à l'avenir.
Par exemple:
Dans tous les cas, tous les formulaires sont acceptables. L'implémentation que vous décidez dépend davantage des préférences personnelles et des capacités de votre serveur.
À part: Permettez-moi de clarifier car il semble y avoir une certaine confusion. Le paramètre de requête et / ou le type de contenu 'print' est utilisé pour spécifier comment la ressource est transformée. Pas comment déclencher un travail d'impression physique. Pour des raisons de sécurité, l'accès au niveau matériel est toujours laissé à l'utilisateur / client / navigateur.
la source
?print=true
), vous pouvez également utiliser les paramètres URI (c'est-à-dire -/customer/{id}/printable
). Lequel vous utiliserez dépendra en grande partie de la norme que votre système (CMS, framework, code en général) est configuré pour gérer. Les deux sont considérés comme valides et acceptables .