web-dev-qa-db-fra.com

Quelle est la différence entre REST et les protocoles HTTP?

Qu'est-ce que le protocole REST et en quoi diffère-t-il du protocole HTTP?

30
Adham

REST est une approche qui exploite le protocole HTTP et n’est pas une alternative à celui-ci.

Les données sont référencées de manière unique par URL et peuvent être utilisées à l'aide d'opérations HTTP (GET, PUT, POST, DELETE, etc.). Un grand nombre de types mime sont pris en charge pour le message/réponse, mais XML et JSON sont les plus courants.

Par exemple, pour lire des données sur un client, vous pouvez utiliser une opération de récupération HTTP avec l'URL http://www.example.com/customers/1 . Si vous souhaitez supprimer ce client, utilisez simplement l'opération de suppression HTTP avec la même URL.

Le code Java ci-dessous montre comment passer un appel REST via le protocole HTTP:

String uri =
    "http://www.example.com/customers/1";
URL url = new URL(uri);
HttpURLConnection connection =
    (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "application/xml");

JAXBContext jc = JAXBContext.newInstance(Customer.class);
InputStream xml = connection.getInputStream();
Customer customer =
    (Customer) jc.createUnmarshaller().unmarshal(xml);

connection.disconnect();

Pour un exemple Java (JAX-RS), voir:

31
Blaise Doughan

REST est un style de conception pour les protocoles. Il a été développé par Roy Fielding dans sa thèse de doctorat et a formalisé l’approche derrière HTTP/1.0, en trouvant ce qui fonctionnait bien, puis en utilisant cette compréhension plus structurée pour influencer la conception de HTTP /. 1.1. Ainsi, même s’il s’agissait après coup de nombreuses conséquences, REST est le style de conception à la base de HTTP.

La thèse de Fielding peut être trouvée à http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm et vaut vraiment la peine d'être lue et très lisible. Les thèses de doctorat peuvent être assez ardues, mais celle-ci est merveilleusement bien décrite et très lisible par ceux qui n'ont pas un niveau comparable d'informatique. Cela aide que REST lui-même soit assez simple; c'est une de ces choses qui sont évidentes après que quelqu'un d'autre l'ait imaginé. (Cela englobe aussi beaucoup de choses que les développeurs Web plus anciens ont appris eux-mêmes à la dure dans un style simple, ce qui a fait de le lire un moment majeur "a ha!" Pour beaucoup).

D'autres protocoles d'application ainsi que HTTP peuvent également utiliser REST, mais HTTP est l'exemple classique.

Étant donné que HTTP utilise REST, toutes les utilisations de HTTP utilisent un système REST. La description d'une application ou d'un service Web en tant que RESTful ou non-RESTful indique si elle tire parti de REST ou joue contre elle.

L'exemple classique d'un système RESTful est un site Web "ordinaire" sans cookies (les cookies ne sont pas toujours opposés à REST, mais ils peuvent l'être): l'état du client est modifié lorsque l'utilisateur clique sur un lien qui charge une autre page ou effectue un formulaire GET. requêtes qui apporte des résultats. Les requêtes de formulaire POST peuvent modifier à la fois l'état du serveur et celui du client (le serveur effectue une opération sur la base du POST, puis envoie un document hypertexte décrivant le nouvel état). Les URI décrivent les ressources, mais l'entité (le document) la décrivant peut différer en fonction du type de contenu ou de la langue souhaitée par l'utilisateur. Enfin, il a toujours été possible pour les navigateurs de mettre à jour la page elle-même via PUT et DELETE, bien que cela n'ait jamais été très courant et que rien ne le soit moins maintenant.

L’exemple classique d’un système non RESTful utilisant HTTP traite HTTP comme s’il s’agissait d’un protocole de transport, et envoie à chaque demande un POST de données au même URI, qui est ensuite utilisé dans un protocole RPC. de la même manière, éventuellement avec la connexion elle-même ayant un état partagé.

Un système lisible par ordinateur RESTful (c’est-à-dire pas un site Web dans un navigateur, mais quelque chose utilisé par programme) obtiendrait des informations sur les ressources concernées par GETting URI qui renverrait ensuite un document (par exemple en XML, mais pas nécessairement) décrivant l’état. de la ressource, y compris les URI aux ressources associées (hypermédia par conséquent), modifient leur état via des entités PUTting décrivant le nouvel état ou les SUPPRIMANT, et faisant effectuer d'autres actions par POSTing.

Les principaux avantages sont les suivants:

Evolutivité: le manque d’état partagé crée un système beaucoup plus évolutif (ce qui m’a été démontré massivement lorsque j’ai retiré toute utilisation de l’état de session d’un site Web très fréquenté, alors que je m'attendais à ce qu’il donne un peu plus de performance, même longue. Le défenseur du temps anti-session comme moi a été époustouflé par le gain énorme de retirer ce qui était un usage plutôt mince des sessions, ce n’était même pas la raison pour laquelle je les retirais!)

Simplicité: REST est plus simple que plusieurs modèles de type RPC de différentes manières. En particulier, il n’existe que quelques "verbes" possibles, et chaque type de ressource peut être raisonné de manière raisonnable. isolement aux autres.

Entités légères: davantage de modèles de type RPC ont tendance à se retrouver avec beaucoup de données dans les entités envoyées dans les deux sens, afin de refléter le modèle de type RPC. Ce n'est pas nécessaire. En effet, parfois, un simple document en clair est tout ce qui est vraiment nécessaire dans un cas donné. Dans ce cas, avec REST, c’est tout ce que nous aurions besoin d’envoyer (bien que ce ne soit qu'un cas de "résultat final", car le texte ne lie pas aux ressources associées). Un autre exemple classique est une demande d’obtention d’un fichier image. Les modèles de type RPC doivent généralement l’envelopper dans un autre format et éventuellement le coder de manière à ce qu’il reste dans le format parent (par exemple, si le modèle de type RPC utilise XML). , l’image devra être en base 64'd ou similaire pour tenir dans un XML valide). Un modèle RESTful transmet simplement le fichier de la même manière qu’il le fait à un navigateur.

Résultats lisibles par l'homme: Pas nécessairement, mais il est souvent facile de créer un service Web RESTful où les résultats sont relativement faciles à lire, ce qui facilite le débogage et le développement. J'en ai même construit un où un XSLT signifiait que tout le contenu pouvait être utilisé par des humains en tant que site Web (relativement grossier), bien que ce ne soit pas principalement à usage humain (essentiellement, le XSLT sert de client pour le présenter à utilisateurs, ce n'était même pas dans les spécifications, juste fait pour faciliter mon propre développement!).Liaison plus étroite entre serveur et client: conduit à un développement ultérieur plus facile ou change la manière dont le système est hébergé. En effet, si vous vous en tenez au modèle hypertexte, vous pouvez modifier l’ensemble de la structure, notamment en passant d’un hôte à plusieurs hôtes pour différents services, sans changer le code client.

Mise en cache: pour les opérations GET où le client obtient des informations sur l'état d'une ressource, les mécanismes de mise en cache HTTP standard autorisent à la fois les déclarations indiquant que la ressource ne changera pas de manière significative jusqu'à une certaine date au plus tôt (aucune interrogation requise à ce jour) ) ou qu’il n’a pas changé depuis la dernière requête (envoyez quelques centaines d’octets d’en-têtes le disant plutôt que plusieurs kilo-octets de données). L’amélioration des performances peut être considérable (assez grande pour déplacer la performance de quelque chose qui devient impossible à utiliser au point où la performance n’est plus un problème dans certains cas).

Disponibilité des boîtes à outils: Comme il fonctionne à un niveau relativement simple, si vous avez un serveur Web, vous pouvez créer un serveur de système RESTful et si vous avez une sorte d’API client HTTP (XHR dans JavaScript du navigateur, HttpWebRequest dans .NET, etc.), vous pouvez construire un client de système RESTful.

Résilience: en particulier, l'absence d'état partagé signifie qu'un client peut mourir et redevenir utilisé sans que le serveur le sache, et même le serveur peut mourir et redevenir utilisé sans que le client le sache. Évidemment, les communications au cours de cette période échoueront, mais une fois le serveur remis en ligne, les choses pourront simplement continuer comme elles étaient. Cela simplifie également vraiment l'utilisation des batteries de serveurs Web pour la redondance et les performances: chaque serveur agit comme s'il s'agissait du seul serveur existant et il importait qu'il ne traite en réalité qu'une fraction des demandes d'un client donné.

Resiliance: In particular, the lack of shared state means that a client can die and come back into use without the server knowing, and even the server can die and come back into use without the client knowing. Obviously communications during that period will fail, but once the server is back online things can just continue as they were. This also really simplifies the use of web-farms for redundancy and performance - each server acts like it's the only server there is, and it doesn't matter that its actually only dealing with a fraction of the requests from a given client.

35
Jon Hanna

REST n'est pas un protocole, c'est une architecture généralisée permettant de décrire une plate-forme de média distribué client-serveur en mode sans état. Une architecture REST peut être mise en œuvre à l'aide d'un certain nombre de protocoles de communication différents, même si HTTP est de loin le plus courant.

10
aroth

REST n'est pas un protocole, c'est un moyen d'exposer votre application, principalement via HTTP. 

par exemple, vous souhaitez exposer une API de votre application qui getClientById.
au lieu de créer une URL 

yourapi.com/getClientById?id=4
tu peux faire
yourapi.com/clients/id/4 

puisque vous utilisez une méthode GET, cela signifie que vous souhaitez obtenir des données 

Vous profitez des méthodes HTTP: GET/DELETE/PUT
yourapi.com/clients/id/4 peut également traiter la suppression, si vous envoyez une méthode de suppression et non GET, ce qui signifie que vous souhaitez dessiner l’enregistrement. 

4
fatnjazzy

Toutes les réponses sont bonnes.

J'ajoute par la présente une description détaillée de RESTE et de la façon dont il utilise HTTP.

REST = Transfert d'état représentationnel

RESTE est un ensemble de règles qui, lorsqu'elles sont suivies, vous permettent de créer une application distribuée comportant un ensemble spécifique de contraintes souhaitables.

Il est sans état, ce qui signifie qu’idéalement, aucune connexion ne doit être maintenue entre le client et le serveur. 

Il incombe au client de transmettre son contexte au serveur, qui peut ensuite stocker ce contexte pour traiter la demande ultérieure du client. Par exemple, la session gérée par le serveur est identifiée par l'identificateur de session transmis par le client.

Avantages de l'apatridie:

  1. Les services Web peuvent traiter chaque appel de méthode séparément.
  2. Les services Web ne doivent pas nécessairement conserver la précédente interaction du client.
  3. Cela simplifie à son tour la conception des applications.
  4. HTTP est lui-même un protocole sans état contrairement à TCP et, par conséquent, les services Web RESTful fonctionnent de manière transparente avec les protocoles HTTP.

Inconvénients de l'apatridie: 

  1. Une couche supplémentaire sous la forme d'en-tête doit être ajoutée à chaque demande pour préserver l'état du client.
  2. Pour des raisons de sécurité, il peut être nécessaire d’ajouter une information d’en-tête à chaque requête.

Méthodes HTTP prises en charge par REST:

GET: /string/someotherstring:
Il est idempotent (signifie que plusieurs appels doivent renvoyer les mêmes résultats à chaque fois) et, idéalement, renvoyer les mêmes résultats à chaque appel.

METTRE:
Identique à GET. Idempotent et est utilisé pour mettre à jour les ressources.

POST: devrait contenir une URL et un corps
Utilisé pour créer des ressources. Plusieurs appels devraient idéalement renvoyer des résultats différents et créer plusieurs produits.

EFFACER:
Utilisé pour supprimer des ressources sur le serveur. 

TÊTE: 

La méthode HEAD est identique à GET sauf que le serveur NE DOIT PAS renvoyer de corps de message dans la réponse. Les méta-informations contenues dans les en-têtes HTTP en réponse à une demande HEAD DEVRAIENT être identiques aux informations envoyées en réponse à une demande GET.

OPTIONS: 

Cette méthode permet au client de déterminer les options et/ou les exigences associées à une ressource, ou les fonctionnalités d'un serveur, sans impliquer d'action de ressource ni de lancement d'une récupération de ressource.

Réponses HTTP

Allez ici pour toutes les réponses

En voici quelques unes importantes:
200 - OK
3XX - Informations supplémentaires requises du client et redirection d’URL
400 - Mauvaise requête
401 - Accès non autorisé
403 - Interdit
La demande était valide, mais le serveur refuse l'action. L'utilisateur peut ne pas avoir les autorisations nécessaires pour une ressource ou peut avoir besoin d'un compte quelconque.

404 - introuvable
La ressource demandée est introuvable mais peut être disponible dans le futur. Les demandes ultérieures du client sont acceptables.

405 - Méthode non autorisée Une méthode de demande n'est pas prise en charge pour la ressource demandée; Par exemple, une demande GET sur un formulaire nécessitant la présentation de données via POST ou une demande PUT sur une ressource en lecture seule.

404 - Requête non trouvée
500 - Panne de serveur interne
502 - Erreur de passerelle incorrecte 

0
Pritam Banerjee