J'essaie de convertir un ensemble de services basés sur SOAP en une API RESTful.
J'ai commencé par identifier les ressources en analysant les noms des opérations et j'ai obtenu la ressource Subscription
.
Lorsque j'ai besoin de mettre à jour l'état de l'abonnement, je ne peux pas simplement envoyer une POST
demande au serveur, car je n'ai pas d'accès direct aux ressources, mais je dois appeler des opérations de style RPC pour mettre à jour leurs propriétés. De plus, uniquement et uniquement si je modifie l'état de l'abonnement sur "actif", un appel supplémentaire vers un service externe est requis.
Dans ces cas, quelle est la meilleure pratique pour gérer les opérations sous-jacentes?
La solution que j'ai trouvée est d'utiliser des paramètres de requête, de sorte que si je dois appeler le service d'activation, je peux utiliser quelque chose comme:
POST /subscriptions/{subscriptionid}/?activate=true
Étant donné que je ne peux pas mettre à jour directement mes champs d'objet d'abonnement, existe-t-il une meilleure pratique pour gérer ce type de conversion?
Mise à jour 1:
Je peux mettre dans le corps de ma requête POST quelques valeurs, par exemple "état": "actif"
et vérifier à l'intérieur de mon service les opérations à déclencher.
la source
Réponses:
Vous devez regarder cette conférence de Jim Webber.
Pensez "messagerie"; envoyer un message à votre domaine, décrivant ce que vous voulez que cela se produise. L'effet secondaire du message est que votre modèle de domaine change réellement son état. La "ressource" est la file d'attente de messages.
L'orthographe du nom de la ressource n'a pas d'importance pour les machines; mais les gens ont tendance à devenir pointilleux lorsque les identifiants que vous utilisez ne respectent pas la convention selon laquelle les ressources sont des "noms".
En outre, nous parlons d'une ressource qui est subordonnée à
/subscriptions/{subscriptionid}
, donc la convention (voir RFC 3986 ) appelle à exprimer cette relation avec un segment de chemin, plutôt que d'utiliser la partie requête.Donc, ces orthographes pourraient être raisonnables
la source
Si c'est un drapeau booléen pour activer / désactiver des trucs, je dirais que la valeur par défaut est d'utiliser JSON:
Ceci est facilement étendu si vous souhaitez prendre en charge plus de propriétés. Une autre approche lui donne son propre point final:
Personnellement, je n'utiliserais cela que si l'
active
état de cet événement a besoin / possède des propriétés que vous pouvez ensuite passer / obtenir en JSON, comme un ID utilisateur ou un paramètre.Si ce n'est pas une valeur booléenne mais juste une action que vous devez déclencher mais dont vous n'avez pas besoin / n'avez aucun retour d'état (à l'exception d'un 200 OK immédiat), j'utiliserais un point de terminaison comme celui-ci pour le déclencher un peu comme un RPC:
En cas de doute, lisez ceci: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#restful (voir "Qu'en est-il des actions qui ne rentrent pas dans le monde des opérations CRUD? ")
la source
REST n'est pas fonctionnel.
Activate
est un verbe et ne peut pas être un état,Active
est un état.Étant donné que RESTful n'est pas fonctionnel, vous ne pouvez pas dire à un service RESTful quoi faire, mais vous pouvez ajouter du travail pour la file d'attente d'un service.
Regarde ça:
Cette demande est RESTful et prend en charge tous les avantages de RESTful (comme les performances, l'acide ...)
la source