L'idée de RE présentation S tate T ransfert ne est pas sur l' accès aux données de la manière la plus simple possible.
Vous avez suggéré d'utiliser des demandes de publication pour accéder à JSON, qui est un moyen parfaitement valide d'accéder / manipuler des données.
REST est une méthodologie pour un accès significatif aux données. Lorsque vous voyez une demande dans REST, ce qui se passe avec les données doit immédiatement apparaître.
Par exemple:
GET: /cars/make/chevrolet
va probablement retourner une liste de voitures chevy. Une bonne API REST pourrait même incorporer certaines options de sortie dans la chaîne de requête comme ?output=json
ou ?output=html
qui permettraient à l'accesseur de décider dans quel format les informations doivent être encodées.
Après un peu de réflexion sur la façon de typage des données raisonnablement insertion dans un API REST, j'ai conclu que la meilleure façon de spécifier le type de données serait explicitement être via l'extension de fichier déjà existant tel que .js
, .json
, .html
ou .xml
. Une extension de fichier manquante prendrait par défaut le format par défaut (tel que JSON); une extension de fichier non prise en charge pourrait renvoyer un 501 Not Implemented
code d'état .
Un autre exemple:
POST: /cars/
{ make:chevrolet, model:malibu, colors:[red, green, blue, grey] }
va probablement créer un nouveau chevy malibu dans la base de données avec les couleurs associées. Je dis probablement que l'API REST n'a pas besoin d'être directement liée à la structure de la base de données. C'est juste une interface de masquage pour que les vraies données soient protégées (pensez-y comme des accesseurs et des mutateurs pour une structure de base de données).
Nous devons maintenant passer à la question de l' idempotence . Habituellement, REST implémente CRUD sur HTTP. HTTP utilise GET
, PUT
, POST
et DELETE
pour les demandes.
Une implémentation très simpliste de REST pourrait utiliser le mappage CRUD suivant:
Create -> Post
Read -> Get
Update -> Put
Delete -> Delete
Il y a un problème avec cette implémentation: Post est défini comme une méthode non idempotente. Cela signifie que les appels ultérieurs de la même méthode Post entraîneront des états de serveur différents . Get, Put et Delete sont idempotents; ce qui signifie que les appeler plusieurs fois devrait entraîner un état de serveur identique.
Cela signifie qu'une demande telle que:
Delete: /cars/oldest
pourrait en fait être implémenté comme:
Post: /cars/oldest?action=delete
Tandis que
Delete: /cars/id/123456
entraînera le même état de serveur si vous l'appelez une fois, ou si vous l'appelez 1000 fois.
Une meilleure façon de gérer le retrait de l' oldest
article serait de demander:
Get: /cars/oldest
et utilisez les ID
données résultantes pour faire une delete
demande:
Delete: /cars/id/[oldest id]
Un problème avec cette méthode serait si un autre /cars
élément était ajouté entre le moment où a /oldest
été demandé et le moment où le a delete
été émis.