L'idée de RE présentation S tate T e transfert ne consiste pas à accéder aux données de la manière la plus simple possible.
Vous avez suggéré d'utiliser des requêtes postales pour accéder à JSON, ce qui est un moyen parfaitement valable d'accéder à des données et de les manipuler.
REST est une méthodologie pour significatif l'accès aux données. Lorsque vous voyez une requête en REST, vous devez immédiatement savoir ce qui se passe avec les données.
Par exemple :
GET: /cars/make/chevrolet
va probablement renvoyer une liste de voitures Chevrolet. Une bonne interface REST pourrait même incorporer des options de sortie dans la chaîne de requête, comme par exemple ?output=json
o ?output=html
qui permettrait à l'accesseur de décider du format dans lequel l'information doit être encodée.
Après avoir réfléchi à la manière d'intégrer raisonnablement le typage des données dans une API REST, j'ai conclu que la meilleure façon de spécifier explicitement le type de données serait d'utiliser l'extension de fichier déjà existante, telle que .js
, .json
, .html
ou .xml
. Si une extension de fichier est manquante, le format par défaut sera utilisé (par exemple JSON) ; si une extension de fichier n'est pas prise en charge, le système renverra un message d'erreur de type 501 Not Implemented
code d'état .
Autre exemple :
POST: /cars/
{ make:chevrolet, model:malibu, colors:[red, green, blue, grey] }
va probablement créer une nouvelle chevy malibu dans le db avec les couleurs associées. Je dis que vraisemblablement car l'interface REST n'a pas besoin d'être directement liée à la structure de la base de données. Il s'agit simplement d'une interface de masquage permettant de protéger les vraies données (comme les accesseurs et les mutateurs pour une structure de base de données).
Nous devons maintenant passer à la question de la idempotence . En général, REST met en œuvre CRUD sur HTTP. HTTP utilise GET
, PUT
, POST
y 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 mise en œuvre : Post est définie comme une méthode non idempotente. Cela signifie que les appels ultérieurs de la même méthode Post se traduiront par diferente Le serveur est en état de marche. Les fonctions Get, Put et Delete sont idempotentes, ce qui signifie qu'en les appelant plusieurs fois, on obtient un état de serveur identique.
Cela signifie qu'une demande telle que :
Delete: /cars/oldest
pourrait en fait être mis en œuvre comme suit :
Post: /cars/oldest?action=delete
Considérant que
Delete: /cars/id/123456
aboutira au même état du serveur si vous l'appelez une seule fois ou si vous l'appelez 1000 fois.
Une meilleure façon de gérer la suppression de la oldest
serait de demander :
Get: /cars/oldest
et utiliser le ID
à partir des données obtenues pour établir une delete
demande :
Delete: /cars/id/[oldest id]
Cette méthode pose un problème si un autre /cars
a été ajouté entre le moment où /oldest
a été demandée et lorsque le delete
a été publié.
4 votes
Pourquoi imposer une charge utile JSON ? Et s'il n'y a pas de JSON, et qu'il s'agit d'un simple GET ?
1 votes
Oui. w3.org/Protocoles/rfc2616/rfc2616-sec9.html#sec9