2010-07-25 3 views
1

Je suis un peu en retard à la fête, mais j'essaie de comprendre comment REST est censé fonctionner, à la fois en général et dans Ruby on Rails. J'ai déjà lu un tas d'articles en ligne à ce sujet, mais je n'ai toujours pas l'impression d'avoir une vue d'ensemble. REST si je comprends bien, est une série de déclarations aspirationnelles, avec le résultat net au fond étant que les URL doivent contenir toutes les informations nécessaires pour traiter une demande, et ne doit pas être en mesure de changer l'état sur le serveur, et un tas d'autres directives concrètes. Si je comprends bien, REST in Rails est basé sur CRUD, c'est-à-dire que chaque modèle a une action create, read, update et delete. Chacune de ces actions est accessible via un ensemble d'URL similaire, généré en mappant une ressource dans les routes. Ainsi, une URL de connexion crée une session utilisateur, l'URL ressemblerait à example.com/session/new avec un POST, et la déconnexion serait example.com/session/destroy avec un POST.Comprendre REST conceptuellement avec Rails

Quel est l'avantage de normaliser les URL de cette façon? Cela me semble optimaliser la lisibilité de la machine au détriment de la lisibilité humaine. Je sais que vous pourriez alors remapper dans le fichier de routes example.com/login à example.com/session/new mais c'est juste un pas de plus pour aucun gain apparent pour moi.

Est-ce vraiment une mauvaise pratique de développer un site Web qui utilise maintenant des itinéraires traditionnels?

De plus, chacune de ces actions CRUD devrait être capable de répondre aux demandes avec n'importe quel type de réponse que la requête recherche. Ainsi, le même lien vers example.com/tasks peut également être appelé sur example.com/tasks.xml pour obtenir une représentation xml du résultat, ou sur example.com/tasks.json pour une représentation json. Est-ce pour dire qu'une API RESTful serait simplement les liens habituels sur le site mais avec XML ajouté? Il me semble très étrange et gênant qu'une API Web se comporte de cette manière, mais cela semble être ce qui est impliqué par tout ce que j'ai lu. Je suis plus habitué à voir une API qui a des liens comme example.com/api/tasks pour obtenir la liste des tâches. Quel est exactement l'avantage de cette approche?

+0

"Au détriment de la lisibilité humaine"? Je dirais le contraire, s'en tenir à un schéma d'URL spécifique pour tout ce qui rend simple à comprendre et à travailler avec. – deceze

+0

Mais il existe déjà un schéma d'URL pour les humains normaux (pas les développeurs). Ce schéma que tous les utilisateurs du Web sont déjà à l'aise dit example.com/login est l'endroit où vous allez vous connecter, pas example.com/session/new. Donc, pour quelque chose comme la connexion, quel est l'avantage de passer au système d'URL REST? Juste pour alléger le fardeau sur les développeurs à comprendre et à travailler avec? Je ne vois pas comment cela améliore la lisibilité de l'utilisateur final. –

+0

Tout le concept de connexion est sans doute plutôt RESTless, car il introduit le concept d'état. Je ne pense pas que RESTfulness prescrive des schémas d'URL d'une manière si spécifique, '/ login' est toujours une URL parfaitement bonne * si cela correspond à votre objectif *. Je voulais dire * en général *, coller à un schéma spécifique est * bon * pour la lisibilité humaine. Comme vous le dites, '/ login' est déjà un schéma accepté, donc c'est bon. – deceze

Répondre

1

Le repos fournit un autre morceau de «convention sur la configuration». Pour un ensemble très limité de problèmes communs (actions crues contre les modèles dans leur ensemble), le repos est très utile en tant que convention de développement d'applications.

Quel est exactement l'avantage de normaliser les URL de cette façon?

Efficacité du programmeur. Moins à réfléchir permet de consacrer plus de temps à des problèmes plus difficiles, etc. Meilleure maintenabilité. Tests plus faciles. Etc.

est-il considéré comme une pratique vraiment mauvais pour développer un site Web qui utilise itinéraires traditionnels maintenant?

Oui, pour les actions crud qui interagissent avec un enregistrement entier du modèle.

En outre, chacune de ces actions CRUD devrait être en mesure de répondre aux demandes avec ce type de réponse la demande est à la recherche. Donc le même lien vers, par exemple, exemple.com/tasks peut également être appelé sur example.com/tasks.xml pour obtenir une représentation xml du résultat, ou example.com/tasks.json pour une représentation json . Est-ce à dire qu'une API RESTful serait simplement les liens habituels sur le site mais avec un XML ajouté?

Oui, si votre api correspond au modèle de repos. Je pense que le gros problème est l'authentification. Si vous voulez que votre API soit apatride, vous devrez probablement inclure une authentification à chaque appel. À ce stade, si vous ne souhaitez pas utiliser l'authentification au niveau HTTP, vous devez décider comment inclure les informations d'identification.

+1

Bonne réponse. Je voudrais ajouter que le fait d'avoir une api sans état (par opposition à l'utilisation de formulaires, en particulier avec des champs cachés, ou l'état dans les cookies ou le stockage de session côté serveur) facilite grandement la création de signets et de scripts. –

+1

Excellent point Christopher. Je pense que trop souvent, les personnes qui fournissent un accès API à leurs services se concentrent sur des clients API «lourds» plutôt que sur des clients API légers, y compris des scripts shell. L'activation de l'inclusion des informations d'identification dans chaque appel d'API aide vraiment avec ce dernier. –

Questions connexes