Depuis le magazine MSDN https://msdn.Microsoft.com/en-us/magazine/dd315413.aspx et https://msdn.Microsoft.com/en-us/magazine/ dd942839.aspx Je comprends que
Lorsque les points de terminaison RESTful sont invités à fournir des données via HTTP, le verbe HTTP utilisé est GET.
L'utilisation de REST signifie que vous pouvez tirer parti de la mise en cache HTTP et d'autres fonctionnalités, telles que GET conditionnel, qui facilitent la mise à l'échelle des services. Beaucoup de ces techniques ne peuvent pas être utilisées avec SOAP parce que SOAP utilise POST uniquement sur HTTP.
Depuis la page Wikipedia http://en.wikipedia.org/wiki/Representational_state_transfer
Les systèmes RESTful communiquent généralement, mais pas toujours, via le protocole de transfert hypertexte avec les mêmes verbes HTTP (GET, POST, PUT, DELETE, etc.) utilisés par les navigateurs Web pour récupérer des pages Web et envoyer des données à des serveurs distants. [
Mais ce sera une violation de l'architecture REST pour utiliser HTTP POST pour obtenir les données d'une ressource ? En d'autres termes, un service web basé sur SOAP) peut-il être RESTful?
Existe-t-il d'autres différences entre RESTful et SOAP webservice based?
Je poste ceci comme réponse parce que les commentaires ne suffisent tout simplement pas. Voici ce que je veux vous résumer.
Tout d'abord, nous allons commencer par ces deux références:
http://spf13.com/post/soap-vs-rest
http://blog.smartbear.com/apis/understanding-soap-and-rest-basics/
Enfin, je veux commencer ce post en disant ce qui suit:
[~ # ~] savon [~ # ~] et [~ # ~] reste [~ # ~] ont tous deux été conçus pour résoudre le problème suivant: comment deux disparates applications, programmes ou appareils échangent et partagent des données entre eux, de manière extensible et facile- manière comprise?
Par conception RESTful ( Re présentation [~ # ~] s [~ # ~] tate [~ # ~] t [~ # ~ ] ransfer) les services utilisent HTTP
et les verbes HTTP
(GET
, POST
, PUT
, DELETE
) pour indiquer l'intention. Ces verbes très clairement indiquent à l'utilisateur ce qui va se passer lorsqu'ils seront utilisés. Le serveur peut les utiliser pour prendre des décisions préemptives. Autrement dit, il peut prendre une décision bien avant l'action est prête à avoir lieu.
Considérez ceci, vous devez accéder à un petit peu de données à partir d'un compte d'utilisateurs Insert Service . Ce qui est plus simple, un GET endpoint/users/account/id
demande ou POST endpoint/users/account
demande qui a un corps de id
? Par définition de [~ # ~] reste [~ # ~] , la demande POST
viole l'accord de base qui [~ # ~] reste [~ # ~] implique. C'est-à-dire: le serveur est censé savoir, avant que les données soient arrivées, quelles intentions l'utilisateur en a. C'est le principe de base que [~ # ~] reste [~ # ~] tente de garantir.
Ce fait, non, cet élément fondamental, exige que la communication RESTful soit autorisée pour indiquer l'intention du client avant que le client ne commence à envoyer des données. Cela permet au serveur de accepter et rejeter les messages bien avant leur arrivée, réduisant ainsi la charge de traitement.
Un autre aspect de [~ # ~] reste [~ # ~] (en particulier avec le Twitter , Facebook et Google API): Les services RESTful , avec l'accent et le mandat sur HTTP
, peuvent tirer parti des en-têtes de réponse HTTP
. Autrement dit, ils peuvent répondre par un HTTP 403 Forbidden
message si le client n'est pas autorisé à accéder. Les services SOAP peuvent ne pas l'être. Le message résultant doit indiquer un tel résultat.
Les services RESTful ont tendance à associer HTTP verbs
(ou actions) avec des noms (ou entités/objets.) De manière générale, la pluralité et la singularité impliquent davantage l'action. C'est à dire. GET RootEndpoint/Employees
devrait renvoyer tous employés (ou au moins un grand groupe répondant à des critères spécifiques.) Considérant que GET RootEndpoint/Employee/12
ne devrait renvoyer qu'un seul employé. (Généralement, employé avec pièce d'identité 12.)
Les services RESTful créent une corrélation directe entre les HTTP verb
(GET
, POST
, PUT
, DELETE
) et l'action . C'est le but de la lien entre les deux: il n'y a rien de spécial qui doit être ajouté au corps du message pour indiquer ce que l'utilisateur a l'intention de faire. (Je continuerai de souligner ce point tout au long.)
[~ # ~] reste [~ # ~] a été entièrement conçu pour HTTP
. Et c'est très bon dans son travail.
De manière générale, pour filtrer les demandes de service REST
, vous devez inclure plusieurs segments d'URL, chaque segment indiquant quel paramètre le suit.
Je vais prendre un exemple de l'API Spotify: https://developer.spotify.com/web-api/get-playlist/
:
Obtenez une liste de lecture
Obtenez une liste de lecture appartenant à un utilisateur Spotify.
Endpoint
GET https://api.spotify.com/v1/users/{user_id}/playlists/{playlist_id}
Paramètres de demande
+---------------------------------------------------+ | Path parameter | Value | +---------------------------------------------------+ | user_id | The user's Spotify user ID. | | playlist_id | The Spotify ID for the playlist. | +---------------------------------------------------+
Dans ce point de terminaison API, vous spécifiez que vous recherchez un objet users
avec user_id
de {user_id}
, et un objet playlists
(dans cet objet users
) avec le playlist_id
de {playlist_id}
.
Certains services RESTful autorisent des drapeaux de combinaison sur les paramètres.
Prenez l'API Stack Exchange, par exemple. Vous pouvez récupérer plusieurs questions ou réponses en les séparant par des points-virgules, et il filtrera essentiellement ces questions ou réponses.
Si nous analysons ce point final (/ questions/{ids}/réponses) , vous verrez qu'il spécifie:
Obtient les réponses à un ensemble de questions identifiées dans id.
Cette méthode est très utile si vous avez un ensemble de questions intéressantes et que vous souhaitez obtenir toutes leurs réponses en même temps ou si vous recherchez des réponses nouvelles ou mises à jour (en conjonction avec sort = activité).
{ids}
peut contenir jusqu'à 100 identifiants délimités par des points-virgules, pour trouver des identifiants rechercher par programmationquestion_id
sur les objets de question.Les tris acceptés par cette méthode opèrent sur les champs suivants de l'objet réponse:
C'est également un bon exemple d'une API qui permet à des requêtes GET
supplémentaires de filtrer/trier les résultats encore plus loin.
Exemple d'utilisation: https://api.stackexchange.com/2.2/questions/30581530/answers?order=desc&sort=activity&site=stackoverflow
Maintenant, si nous faisons la même chose avec le point de terminaison / answers/{ids} , nous pouvons trouver quelque chose comme: https://api.stackexchange.com/2.2/answers/30582379;30581997;30581789;30581628?order=desc&sort=activity&site=stackoverflow
. Cela tire les quatre réponses spécifiées pour nous.
Nous pouvons combiner encore plus, par exemple, avec l'API SE et inclure des filtres pour restreindre les champs retournés: https://api.stackexchange.com/2.2/questions/30581530/answers?order=desc&sort=activity&site=stackoverflow&filter=!)V)P2Uyugvm
. (Voir ce lien vers /2.2/filters pour une explication de ce paramètre filter
.)
Entrez [~ # ~] savon [~ # ~] ( [~ # ~] s [~ # ~ ] imple [~ # ~] o [~ # ~] bject [~ # ~] a [~ # ~] ccess [~ # ~] p [~ # ~] rotocol), qui était le prédécesseur de [~ # ~] reste [~ # ~] . [~ # ~] soap [~ # ~] a résolu ce problème en envoyant des messages dans les deux sens. Ils utilisent XML
(bien que vous puissiez créer un service SOAP sans lui, de manière similaire à la possibilité de créer un Service RESTful sans JSON
) pour échanger un message, par lequel le serveur a aucune indication initiale de ce qu'il faut faire.
Les services SOAP résolvent ce problème d'une manière indépendante du support de transport. Le serveur et le client n'ont pas besoin d'utiliser HTTP
, ni même TCP
. Ils ont juste besoin d'utiliser le même, ou compatible supports de transport. En fait, vous pouvez considérer l'environnement d'entreprise moderne comme un service basé sur SOAP . Lorsque vous avez besoin de nouvelles fournitures, vous mettez une réquisition à votre chef de bureau, qui répond ensuite par un message. Lors de la réception de la demande initiale, votre manager a aucune idée si cela est autorisé ou non. Ils doivent lire le reste de la demande afin de déterminer s'il s'agit d'une demande valide ou non.
[~ # ~] soap [~ # ~] a été conçu autour de RPCs
(appels de procédure à distance), de nombreux pare-feu les bloquent. Par conséquent, [~ # ~] soap [~ # ~] a été modifié pour fonctionner sur HTTP
. Il a été conçu pour intégrer les technologies très différentes.
Parce que [~ # ~] le savon [~ # ~] est conçu autour des messages, c'est un beaucoup plus verbeux un service. Il est généralement plus facile de représenter actions composées dans [~ # ~] soap [~ # ~] services. Autrement dit, si vous demandez objects
en fonction de plusieurs critères (au lieu d'un seul) [~ # ~] soap [~ # ~] a tendance à avoir une meilleure interface pour cela.
Filtre de services SOAP avec des champs supplémentaires dans le RPC. La façon dont ces champs sont combinés dépend du fournisseur.
Je vais prendre un exemple de l'API Global Weather: http://www.webservicex.net/globalweather.asmx?op=GetWeather :
GetWeather
Obtenez le bulletin météo de toutes les grandes villes du monde.
Tester
Pour tester l'opération en utilisant le protocole HTTP POST, cliquez sur le bouton 'Invoke'.
+---------------------------------------------------+ | Parameter | Value | +---------------------------------------------------+ | CityName: | | | CountryName: | | +---------------------------------------------------+
Si vous spécifiez, par exemple, "Blanding" et "United States", vous verrez que le XML généré ressemble à ceci:
<?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <GetWeather xmlns="http://www.webserviceX.NET"> <CityName>Blanding</CityName> <CountryName>United States</CountryName> </GetWeather> </soap12:Body> </soap12:Envelope>
Cela serait soumis (pour une requête HTTP SOAP) en tant qu'appel POST à http://www.webservicex.net/globalweather.asmx/GetWeather
.
Retour à la question d'origine:
C'était votre question initiale, et je pense qu'il va de soi qu'elle ne peut pas, sur la base des informations que j'ai fournies. Ces deux services sont mutuellement exclusifs. [~ # ~] reste [~ # ~] a l'intention de résoudre le problème avec l'échange de headers
qui indiquent l'intention, et message bodies
qui indiquent le but. [~ # ~] soap [~ # ~] a l'intention de résoudre le problème avec l'échange de messages
qui indiquent l'intention et le but.
Sera-ce une violation de l'architecture REST pour utiliser HTTP POST pour obtenir les données d'une ressource? Oui. L'architecture de service RESTful est conçue pour utiliser le terme POST
pour représenter une action spécifique . Chaque HTTP verb
in [~ # ~] reste [~ # ~] représente ce que cette action a l'intention de faire.
Comme je l'ai dit dans les commentaires sur la question initiale:
Vous pouvez utiliser
HTTP POST
pour obtenir les données, mais ce n'est pas un service RESTful alors, comme leHTTP verb
n'a pas de sens. Les services RESTful sont RESTful car le verbe indique l'action .
Cette partie existe principalement pour les futurs lecteurs.
Les deux protocoles ont des avantages et des inconvénients, et vous devez choisir le protocole que vous utilisez en fonction des exigences du problème. Vous expliquer comment accomplir cela dépasse le cadre de cette question et réponse. Cela dit, il y a trois choses à considérer: connaissez votre projet, connaissez vos exigences, et surtout, documentez-le correctement pour votre public.
REST utilise les verbes HTTP pour articuler l'action que vous essayez d'accomplir.
Une demande "GET" demande au service de retourner l'article à un endroit.
Une demande "POST" demande au service de créer une nouvelle entité à un emplacement (qui sera probablement conservé dans une base de données en arrière-plan).
Une demande "PUT" demande au service de mettre à jour une entité existante à un emplacement.
Une demande "SUPPRIMER" demande au service de supprimer une entité existante à un emplacement.
Donc non, vous ne pouvez pas vraiment utiliser "POST" pour quelque chose comme un "GET" et vous appeler toujours une API REST. Vos consommateurs seront vraiment confus par cela.
Conceptuellement, les services sont très différents.
SOAP concerne les appels de procédure à distance (RPC), ce qui signifie qu'il est conçu pour appeler des méthodes à distance. Un proxy des méthodes serveur sur le client doit rester synchronisé avec le serveur. WSDL est couramment utilisé pour garder les modèles synchronisés.
SOAP ignore également de nombreuses fonctionnalités HTTP. Comme vous l'avez mentionné, il utilise les méthodes POST pour tout. Il enveloppe également les données dans un format de données XML propriétaire.
REST utilise des URL pour référencer les ressources. La représentation des ressources peut être dans n'importe quel format (json, xml, csv, binaire, ...) et peut profiter de la négociation de contenu HTTP (en-têtes Accept *). Les méthodes HTTP correspondent très bien aux méthodes CRUD.
Vrai REST doivent utiliser un format de données piloté par hypermédia (HAL, collection JSON, ... ou personnalisé par le fournisseur). Il permet de découvrir les liens vers les ressources associées à partir d'une URL unique fixe .
http://en.wikipedia.org/wiki/HATEOAS
Je ne vois pas comment un même service (un seul contrat) peut répondre à tous ces critères.