REST est le principe architectural sous-jacent du web. Ce qui est étonnant avec le web, c'est que les clients (navigateurs) et les serveurs peuvent interagir de manière complexe sans que le client ne sache rien au préalable du serveur et des ressources qu'il héberge. La principale contrainte est que le serveur et le client doivent tous deux être d'accord sur les éléments suivants médias utilisé, qui dans le cas du web est HTML .
Une API qui adhère aux principes de REST ne nécessite pas que le client connaisse la structure de l'API. Le serveur doit plutôt fournir toutes les informations dont le client a besoin pour interagir avec le service. Un site Formulaire HTML en est un exemple : Le serveur spécifie l'emplacement de la ressource et les champs obligatoires. Le navigateur ne sait pas à l'avance où soumettre l'information, et il ne sait pas à l'avance quelle information soumettre. Ces deux formes d'information sont entièrement fournies par le serveur. (Ce principe est appelé HATEOAS : L'hypermédia comme moteur de l'état des applications .)
Alors, comment cela s'applique-t-il à HTTP et comment la mettre en œuvre dans la pratique ? HTTP est orienté autour des verbes et des ressources. Les deux verbes les plus utilisés sont GET
et POST
que tout le monde reconnaîtra, je pense. Cependant, la norme HTTP en définit plusieurs autres, telles que PUT
et DELETE
. Ces verbes sont ensuite appliqués aux ressources, selon les instructions fournies par le serveur.
Par exemple, imaginons que nous avons une base de données d'utilisateurs qui est gérée par un service web. Notre service utilise un hypermédia personnalisé basé sur JSON, pour lequel nous attribuons le mimetype application/json+userdb
(Il pourrait également y avoir un application/xml+userdb
et application/whatever+userdb
- de nombreux types de supports peuvent être pris en charge). Le client et le serveur ont tous deux été programmés pour comprendre ce format, mais ils ne savent rien l'un de l'autre. Comme Roy Fielding fait remarquer :
Une API REST doit consacrer la quasi-totalité de son effort de description à définir le(s) type(s) de média utilisé(s) pour représenter les ressources et piloter le l'état de l'application, ou à la définition de noms de relations étendues et/ou de balisage hypertexte pour les types de médias standard existants.
Une demande de la ressource de base /
pourrait retourner quelque chose comme ça :
Demande
GET /
Accept: application/json+userdb
Réponse
200 OK
Content-Type: application/json+userdb
{
"version": "1.0",
"links": [
{
"href": "/user",
"rel": "list",
"method": "GET"
},
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
Nous savons, grâce à la description de notre média, que nous pouvons trouver des informations sur des ressources connexes à partir de sections appelées "liens". C'est ce qu'on appelle Contrôles hypermédia . Dans ce cas, nous pouvons dire à partir d'une telle section que nous pouvons trouver une liste d'utilisateurs en faisant une autre demande de /user
:
Demande
GET /user
Accept: application/json+userdb
Réponse
200 OK
Content-Type: application/json+userdb
{
"users": [
{
"id": 1,
"name": "Emil",
"country: "Sweden",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
{
"id": 2,
"name": "Adam",
"country: "Scotland",
"links": [
{
"href": "/user/2",
"rel": "self",
"method": "GET"
},
{
"href": "/user/2",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/2",
"rel": "delete",
"method": "DELETE"
}
]
}
],
"links": [
{
"href": "/user",
"rel": "create",
"method": "POST"
}
]
}
Cette réponse nous apprend beaucoup de choses. Par exemple, nous savons maintenant que nous pouvons créer un nouvel utilisateur en POST
pour /user
:
Demande
POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Karl",
"country": "Austria"
}
Réponse
201 Created
Content-Type: application/json+userdb
{
"user": {
"id": 3,
"name": "Karl",
"country": "Austria",
"links": [
{
"href": "/user/3",
"rel": "self",
"method": "GET"
},
{
"href": "/user/3",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/3",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
Nous savons également que nous pouvons modifier les données existantes :
Demande
PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb
{
"name": "Emil",
"country": "Bhutan"
}
Réponse
200 OK
Content-Type: application/json+userdb
{
"user": {
"id": 1,
"name": "Emil",
"country": "Bhutan",
"links": [
{
"href": "/user/1",
"rel": "self",
"method": "GET"
},
{
"href": "/user/1",
"rel": "edit",
"method": "PUT"
},
{
"href": "/user/1",
"rel": "delete",
"method": "DELETE"
}
]
},
"links": {
"href": "/user",
"rel": "list",
"method": "GET"
}
}
Remarquez que nous utilisons des verbes HTTP différents ( GET
, PUT
, POST
, DELETE
etc.) pour manipuler ces ressources, et que la seule connaissance que nous présumons de la part du client est notre définition du média.
Pour en savoir plus :
(Cette réponse a fait l'objet de nombreuses critiques parce qu'elle n'était pas pertinente. Dans la plupart des cas, cette critique est juste. Ce que j'ai décrit à l'origine correspondait davantage à la manière dont REST était généralement mis en œuvre il y a quelques années, lorsque j'ai écrit ce texte pour la première fois, plutôt qu'à sa véritable signification. J'ai révisé la réponse pour mieux représenter la signification réelle).
3 votes
Voir aussi la réponse au lien suivant stackoverflow.com/a/37683965/3762855
4 votes
REST se fait peut-être un peu vieux maintenant ;) youtu.be/WQLzZf34FJ8
1 votes
Vous pouvez également consulter ce lien pour plus d'informations news.ycombinator.com/item?id=3538585
0 votes
Corrections de la réponse acceptée ici. stackoverflow.com/questions/19843480/ Ou ici roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven Ou ici web.archive.org/web/20130116005443/http://tomayko.com/writings/
0 votes
Juste pour ajouter une phrase qui, selon moi, a beaucoup de sens : "REST consiste à prendre le fonctionnement du Web humain et à l'appliquer au WEB programmatique".
0 votes
La programmation RESTful (cadre rpc) est un cadre rpc populaire mais pas le meilleur. Le cadre rpc Http POST et json est meilleur que le cadre rpc REST. Quelle méthode dois-je utiliser lorsque je veux ajouter une API de connexion ? GET ? POST ? Dois-je utiliser json dans le corps du POST ou dois-je utiliser une requête http dans le corps du POST ? Comment analyser le corps d'une réponse REST ? Le serveur utilisera-t-il json ? Le serveur utilisera-t-il une requête http ? REST ne fait que rendre les choses complexes et incohérentes. Je peux simplement utiliser POST et json pour faire ce que je veux. Je ne veux pas me soucier de GET/POST/DELETE.
0 votes
Mark Knol, l'utilisation de l'humour ou de tout autre comportement humain (comme dire "merci") est strictement interdite par les modérateurs qui ont fait l'expérience du lavement d'humilité.
0 votes
Cette question ne répond pas aux directives de StackOverflow. Il est possible d'y répondre par une simple recherche : fr.wikipedia.org/wiki/Representational_state_transfer
9 votes
@OLIVER.KOO bonne observation. C'est juste que j'ai posé la question à un moment où c'était quelque chose de nouveau. On en parlait beaucoup, mais peu de gens savaient de quoi il s'agissait. En tout cas, moi je ne le savais pas, et il semble que le fait que je l'aie posée les a aidés parce qu'ils voulaient aussi savoir.