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=jsonou ?output=htmlqui 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, .htmlou .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 Implementedcode 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, POSTet DELETEpour 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' oldestarticle serait de demander:
Get: /cars/oldest
et utilisez les IDdonnées résultantes pour faire une deletedemande:
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.