J'ai répondu plus tôt, mais cette réponse contredit mon ancienne réponse et suit une stratégie bien différente pour arriver à une solution. Il montre comment la requête HTTP est construite à partir de concepts qui définissent le REPOS et HTTP. Il utilise également PATCH
au lieu de POST
ou PUT
.
Il va à travers le RESTE les contraintes, puis les éléments de HTTP, puis une solution possible.
RESTE
Le REPOS est un ensemble de contraintes destinées à être appliquées à un hypermédia distribués système afin de le rendre évolutif. Même pour lui donner un sens dans le contexte de contrôler à distance une action, vous devez penser de contrôler à distance une action en tant que partie d'un système hypermédia distribués -- une partie d'un système de découvrir, voir et modifier interconnectés de l'information. Si c'est plus d'ennuis que cela vaut la peine, alors il n'est probablement pas bon pour essayer de rendre tout repos. Si vous voulez juste un "panneau de configuration" type GUI sur le client qui peut déclencher des actions sur le serveur via le port 80, alors vous voudrez probablement une simple interface RPC comme JSON-RPC via des requêtes/réponses HTTP ou un WebSocket.
Mais le RESTE est d'une façon fascinante de la pensée et de l'exemple de la question se trouve être facile pour modèle avec une interface RESTful, prenons donc le défi pour le fun et pour l'éducation.
Le REPOS est définie par quatre contraintes d'interface:
l'identification des ressources; la manipulation des ressources à travers des représentations; auto-descriptif des messages; et, de l'hypermédia comme le moteur de l'état de l'application.
Vous vous demandez comment vous pouvez définir une interface, la satisfaction de ces contraintes, par l'intermédiaire de laquelle un ordinateur indique un autre ordinateur pour faire un aboiement de chien. Plus précisément, vous voulez que votre interface HTTP, et vous ne voulez pas pour jeter les caractéristiques qui font de HTTP Reposante lorsqu'il est utilisé comme prévu.
Commençons avec la première contrainte: identification de ressources.
Toute information qui peut être nommé peut être une ressource: un document ou une image, un temps de service (par exemple, "aujourd'hui, la météo à Los Angeles"), une collection d'autres ressources, un non-objet virtuel (par exemple, une personne), et ainsi de suite.
Si un chien est une ressource. Il doit être identifié.
Plus précisément, une ressource R est un temporellement variable appartenance à la fonction MR(t), qui pour le temps t correspond à un ensemble d'entités, ou des valeurs, qui sont l'équivalent. Les valeurs peuvent être des ressources représentations et/ou des identifiants de ressource.
Vous modèle un chien en prenant une série d'identificateurs et des représentations, et en disant qu'ils sont tous liés les uns avec les autres à un moment donné. Pour l'instant, nous allons utiliser l'identificateur de chien "#1". Ce qui nous amène à la deuxième et à la troisième contraintes: les contraintes de ressources de représentation et d'auto-description.
RESTE des composants d'effectuer des actions sur une ressource à l'aide d'une représentation à la capture de l'actuel ou prévu de l'état de la ressource et de transfert de cette représentation entre les composants. Une représentation est une séquence d'octets, en plus de la représentation de métadonnées pour décrire ces octets.
Voici une séquence d'octets capture de l'état prévu de le chien, c'est à dire la représentation que nous souhaitons être associés à l'identifiant de chien "#1" (notez qu'il ne représente qu'une partie de l'état car il ne concerne pas le nom du chien, de la santé, ou même au-delà écorces):
Il a été aboyer toutes les 10 minutes depuis le temps que ce changement d'état a été effectuée, et peut se poursuivre indéfiniment.
Il est censé être attachés à des métadonnées qui les décrivent. Ces métadonnées peuvent être utiles:
C'est une anglaise déclaration. Il ne décrit qu'une partie de l'état prévu. S'il est reçu plusieurs fois, seulement le premier à avoir un effet.
Enfin, regardons la quatrième contrainte: HATEOAS.
RESTE ... vues d'une application comme une structure cohérente d'information et de contrôle alternatives à travers laquelle l'utilisateur peut effectuer une tâche donnée. Par exemple, à la recherche d'un mot dans un dictionnaire en ligne est une application, est en tournée à travers un musée virtuel, ou l'examen d'un ensemble de notes de cours à étudier pour un examen. ... La prochaine contrôle de l'état de l'application réside dans la représentation de la première ressource demandée, de sorte que l'obtention de cette première représentation est une priorité. ... Le modèle d'application est donc un moteur qui se déplace d'un état à l'autre, en examinant et en choisissant parmi les alternatives les transitions de l'état dans l'ensemble des représentations.
Dans une interface RESTful, le client reçoit une ressource de représentation afin de comprendre comment il devrait recevoir ou envoyer une représentation. Il doit y avoir une représentation quelque part dans l'application à partir de laquelle le client peut comprendre comment envoyer ou recevoir de toutes les représentations, il devrait être en mesure de recevoir ou d'envoyer, même si elle suit une chaîne de représentations pour arriver à cette information. Cela semble assez simple:
Le client demande une représentation d'une ressource identifiée comme la page d'accueil; en réponse, il obtient une représentation qui contient un identifiant de chaque chien le client pourrait vouloir. Le client extraits d'un identifiant et demande le service de la façon dont il peut interagir avec l'identifiés chien, et le service dit le client peut envoyer un anglais description de la partie de l'état du chien. Ensuite, le client envoie une telle déclaration et reçoit un message de réussite ou d'un message d'erreur.
HTTP
HTTP implémente RESTE contraintes comme suit:
identification de ressources: URI
ressources de la représentation: entité-corps
l'auto-description: la méthode ou le code d'état, en-têtes, et peut-être de parties du corps d'entité (par exemple, l'URI de schéma XML)
HATEOAS: les liens hypertexte
Vous avez décidé sur http://api.animals.com/v1/dogs/1
comme l'URI. Supposons que le client a obtenu ce à partir d'une page sur le site.
Nous allons utiliser cette entité-corps (la valeur de next
est un timestamp; une valeur de 0
signifie "lorsque cette demande est reçue'):
{"barks": {"next": 0, "frequency": 10}}
Maintenant nous avons besoin d'une méthode. PATCH correspond à la "partie de l'état" description nous avons décidé de:
Le PATCH demandes de méthode que d'un ensemble de changements décrits dans la demande de l'entité, être appliquée à la ressource identifiée par l'URI de Demande.
Et certains en-têtes:
Pour indiquer la langue du corps d'entité: Content-Type: application/json
Assurez-vous que cela n'arrive qu'une fois: If-Unmodified-Since: <date/time this was first sent>
Et nous avons une demande:
PATCH /v1/dogs/1/ HTTP/1.1
Host: api.animals.com
Content-Type: application/json
If-Unmodified-Since: <date/time this was first sent>
[other headers]
{"barks": {"next": 0, "frequency": 10}}
En cas de succès, le client doit recevoir un 204
code d'état de réponse, ou un 205
si la représentation de l' /v1/dogs/1/
a été modifiée pour refléter la nouvelle aboiements de l'annexe.
En cas d'échec, il devrait recevoir un 403
et un précieux message pourquoi.
Il n'est pas essentiel RESTE pour le service pour tenir compte de l'écorce dans le calendrier d'une représentation en réponse à l' GET /v1/dogs/1/
, mais ça aurait plus de sens si une représentation JSON inclus ce:
"barks": {
"previous": [x_1, x_2, ..., x_n],
"next": x_n,
"frequency": 10
}
Traiter la tâche cron comme un détail d'implémentation que le serveur cache de l'interface. C'est la beauté d'une interface générique. Le client ne doit pas savoir ce que fait le serveur en coulisses, il se soucie est que le service comprend et répond à la demande des changements d'état.