Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SOAP vs REST

SOAP vs REST

SOAP (Simple Object Access Protocol) a été créé il y a tellement longtemps qu'il est difficile d'en trouver la date de première mise à disposition.
Cependant, je me rappelle de la première fois où j'ai fait appel à un Web Service SOAP.
C'était en 2008 pour créer et mettre à jour des noms de domaine avec l'API SOAP d'OVH.
Aujourd'hui, l'API d'OVH existe aussi en REST et l'API SOAP est doucement mise de côté depuis début 2016.
Cette situation de duplicité d'API existe chez les plus grands (ex : eBay, PayPal, Amazon, MS Exchange).
Chez d'autre SOAP est légion (OTA).
Faisons un état des lieux des API SOAP et REST.
Puis voyons quels sont nos moyens de les consommer avec plus ou moins de facilité.

Avatar for Mikaël DELSOL

Mikaël DELSOL

December 19, 2017
Tweet

Other Decks in Programming

Transcript

  1. SOAP L'idée de RPC date d'au moins 1976, quand il

    a été décrit dans le RFC 7071. Une des premières utilisations commerciales de RPC a été faite par la firme Xerox sous le nom de Courier en 1981. La première implantation de RPC sur Unix était le RPC de Sun, utilisée comme la base pour NFS (Network File System).  SOAP veut dire « Simple Object Access Protocol »  SOAP est un protocole de RPC (Remote Procedure Call) orienté objet bâti sur XML  SOAP a remplacé XML-RPC  SOAP a été initialement défini par Microsoft et IBM
  2. Comment savoir quoi envoyer ?  Description du Web Service

    grâce au WSDL  WSDL : Web Services Description Language  Ni plus ni moins qu’un (ou plusieurs) fichier XML  Equivaut à un contrat d’interface WSDL 1.1 a été proposé en 2001 au W3C pour standardisation mais n'est pas approuvée par le W3C. La version 2.0 a été approuvée le 27 juin 2007 et est désormais une recommandation officielle du W3C.
  3. Le WSDL Contient à minima :  <definitions>  <binding>

    : mode d’envoi de la requête (HTTP POST, HTTP GET, SOAP)  <service> : les services disponibles  <port> : point d’entrée associé à une adresse unique
  4. Un message SOAP L’entête est optionel http://schemas.xmlsoap.org/soap/envelope/ SOAP-ENV : enveloppe

    SOAP-ENV : entête SOAP-ENV : corps <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP- ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"> </SOAP-ENV:Envelope> <SOAP-ENV:Body> <ns1:Add> <ns1:intA>12</ns1:intA> <ns1:intB>89</ns1:intB> </ns1:Add> </SOAP-ENV:Body>
  5. Une requête SOAP === requête HTTP POST POST /calculator.asmx HTTP/1.1

    Host: www.dneonline.com Connection: Keep-Alive User-Agent: PHP-SOAP/7.0.14 Content-Type: text/xml; charset=utf-8 SOAPAction: "http://tempuri.org/Add" Content-Length: 266 Entêtes <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"> <SOAP-ENV:Body> <ns1:Add> <ns1:intA>12</ns1:intA> <ns1:intB>89</ns1:intB> </ns1:Add> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Corps
  6. Une réponse SOAP === réponse HTTP HTTP/1.1 200 OK Cache-Control:

    private, max-age=0 Content-Length: 327 Content-Type: text/xml; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET Date: Wed, 13 Dec 2017 15:01:35 GMT Entêtes <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <AddResponse xmlns="http://tempuri.org/"> <AddResult>101</AddResult> </AddResponse> </soap:Body> </soap:Envelope> Corps
  7. Comparatif de SOAP et REST jusqu’ici SOAP REST Protocole Architecture

    1976 (RPC) / 2007 (WSDL 2.0) Thèse en 2000 WSDL Swagger, RAML, Apiary, WADL, rien Requêtes POST (GET) Requêtes POST, GET, PUT, DELETE, etc. Réponses XML uniquement Réponses XML, JSON, etc. REST : voir la présentation de Nicolas Perussel  Architecture REST & API RESTful Pas de relation entre les données Découvrable (level 3 !)
  8. Ca se consomme avec quoi SOAP ? 2014 WsdlToPhp/PackageGenerator Générateur

    de SDK PHP phpro/soap-client Simplifier/améliorer l’utilisation de Web Service SOAP BeSimple/BeSimpleSoap Utilitaires autour de SoapClient 2009 wsdl2phpgenerator/wsdl2phpgenerator Générateur de SDK PHP zendframework/zend-soap Client SOAP mikaelcom/WsdlToPhp Générateur de SDK PHP 2012 SoapUI Client lourd SOAP + tests 2005 NuSOAP Librairie indépendante de toute autre librairie PHP SoapClient Extension PHP à installer
  9. SoapClient - natif Extension PHP soap Nécessite l’extension libxml Fournit

    des classes de base : SoapClient, SoapHeader, SoapVar, SoapParam, SoapFault, SoapServer Permet la surcharge bas niveau (__doRequest, __call) Méthodes nommées avec 2 undescores (__laMéthode) <?php $client = new SoapClient('books.wsdl', [ 'classmap' => [ 'book' => '\\My\\Namespace\\Book', ], )); $result = $client->getBooks(); // peut aussi être appelé comme ça : $client->__call('getBooks');
  10. NuSOAP - open source Originellement sur SourceForge Indépendant de toute

    librairie/extension PHP Plusieurs versions sur Github  detain/nusoap (portage du projet originel), dernier commit le 07/12/2017  econea/nusoap (Fixed NuSOAP for PHP 5.4 - 7.1), dernier commit le 06/12/2017  Similaire à la classe native PHP SoapClient <?php // Config $client = new nusoap_client('example.com/api/v1', 'wsdl'); $client->soap_defencoding = 'UTF-8'; $client->decode_utf8 = false; $data = []; // Calls $result = $client->call($action, $data);
  11. SoapUI - "The Complete API Test Automation Framework for SOAP,

    REST and More” Client lourd Java édité par la société SMARTBEAR https://smartbear.com/ Permet de charger un WSDL On construit, on envoie la requête et il affiche la réponse Permet de faire des tests automatisés Ne peut pas être intégré dans votre code
  12. wsdl2phpgenerator/wsdl2phpgenerator - open source Génère un SDK PHP sur la

    base d’un WSDL Installation : composer require wsdl2phpgenerator/wsdl2phpgenerator Quelques options utiles : Namespace global, Limiter les opérations à générer, Proxy Client limité Regroupement des constantes <?php $generator = new \Wsdl2PhpGenerator\Generator(); $generator->generate(new \Wsdl2PhpGenerator\Config([ 'inputFile' => 'sample.wsdl', 'outputDir' => __DIR__ . '/src' ]) ); require __DIR__ . '/src/autoload.php'; $service = new \CurrencyConvertor(); $request = new \ConversionRate(\Currency::USD, \Currency::EUR); $response = $service->ConversionRate($request); $result = $response->getConversionRateResult();
  13. zendframework/zend-soap - open source Surcharge de la class native SoapClient

    Installation : composer require zendframework/zend-soap Fournit le code client et le code serveur Le client fournit des méthodes haut niveau <?php $client = new Zend\Soap\Client('MyService.wsdl'); // $result1 is a string $result1 = $client->method1(10); // $result2 is a float $result2 = $client->method2(22, 'some string');
  14. BeSimple/BeSimpleSoap - open source Surcharge de la class native SoapClient

    Installation : composer require besimple/soap Fournit le code client et le code serveur Le client fournit des méthodes haut niveau Inactif…
  15. WsdlToPhp/PackageGenerator - open source Génère un SDK PHP sur la

    base d’un WSDL Installation : composer require wsdltophp/packagegenerator wget https://phar.wsdltophp.com/wsdltophp-php7.phar Beaucoup d’options de génération : Proxy, basic auth, dossiers de génération, composer, starter kit auto-généré, commentaires de classes, etc. Décorateur de la classe SoapClient Héritage pour les classes de type Service, Struct et Array of Struct Regroupement des constantes, règles de validation des données, etc. <?php // Options definition $options = (GeneratorOptions::instance()) ->setOrigin('ebaySvc.wsdl') ->setDestination(__DIR__) ->setComposerName('myproject/mysdk'); // Generator instanciation and package generation (new Generator($options))->generatePackage(); require_once __DIR__ . ‘/vendor/autoload.php’; $service = new ServiceType\Get() $result = $service->GetAccount(new StructType\GetAccountRequest());  This library's parser is the best.  Alexander Bolshakov
  16. phpro/soap-client - open source Génère les classes utiles Installation :

    composer require phpro/soap-client Plusieurs options de génération Middlewares <?php // config.php return Config::create() ->setWsdl('https://www.paypalobjects.com/wsdl/PayPalSvc.wsdl') ->setTypeDestination('src/SoapTypes') ->setTypeNamespace('SoapTypes') ->setClientDestination('src') ->setClientNamespace('SoapClient') ->setClientName('MySoapClient') ->addSoapOption('features', SOAP_SINGLE_ELEMENT_ARRAYS) ->addRule(new Rules\AssembleRule(new Assembler\GetterAssembler())) ->addRule(new Rules\TypenameMatchesRule( new Rules\AssembleRule(new Assembler\RequestAssembler()), '/Request$/’ )) ->addRule(new Rules\TypenameMatchesRule( new Rules\AssembleRule(new Assembler\ResultAssembler()), '/Response$/’ )); $ vendor/bin/soap-client generate:classmap --config config.php $ vendor/bin/soap-client generate:types --config config.php $ vendor/bin/soap-client generate:client --config config.php
  17. Ca se consomme avec quoi REST ? Swagger : Depuis

    l’interface utilisateur généré par Swagger Limité Guzzle - http://docs.guzzlephp.org/en/stable/ : Client HTTP générique Il faut créer son propre SDK manuellement swagger-api/swagger-codegen - https://github.com/swagger-api/swagger-codegen : Générateur de SDK PHP basé sur un fichier Swagger Développé en Java  SDK vendor : Fournit par le fournisseur de l’API Ex :
  18. Utilisation du JAR  $ wget http://central.maven.org/maven2/io/swagger/swagger-codegen-cli/2.2.3/swagger-codegen-cli-2.2.3.jar Génération du SDK

    PHP $ java -jar swagger-codegen-cli-2.2.3.jar generate \ -I https://host.tld/swagger.json -l php \ -o /src $ cd src/SwaggerClient-php/ $ composer install Installation via les sources $ git clone https://github.com/swagger-api/swagger-codegen $ cd swagger-codegen $ mvn clean package (maven => +68 Dependent packages ) Swagger Code Generator - open source <?php $loginClient = new Swagger\Client\Api\LoginApi(); $loginClient->getApiClient()->getConfig()->setHost('http://host.tld'); /** @var Swagger\Client\Model\LoggedInOrganizer $jwtTokenResult */ $jwtTokenResult = $loginClient->apiLoginOrganizer('login', 'password'); $eventClient = new Swagger\Client\Api\EventApi(); $eventClient->getApiClient()->getConfig() ->setHost('http://host.tld') ->addDefaultHeader('Authorization', sprintf(‘bearer %s', jwtTokenResult->getToken())); $result = $eventClient->getEventCollection();
  19. Comparatif de SOAP et REST jusqu’ici SOAP Est forcément définit

    par un WSDL Oblige à développer ses propres solutions SDK et autre REST Est « souvent » accompagné d’un Swagger Est « souvent » accompagné de SDKs N’est pas toujours respecté à la lettre HTTP Status Code Chemin de ressources Versionning REST is the new SOAP
  20. Les questions que l’on peut se poser API PayPal :

    quelle API utiliser ? API References and Guides International Developer Questions SOAP : y’a tout, API originelle REST : pas sûr d’avoir tout en fonction du pays d’origine du compte REST ou SOAP plus rapide à consommer ? SDK REST fourni ? OUI : utiliser le SDK NON : Swagger fourni ? OUI : swagger code generator NON : SOAP avec un générateur de SDK Temps de réponse ? Aucune assurance que l’une soit plus rapide que l’autre Quelle API est la plus sécurisée ? REST peut-être protégé par Basic Auth, Oauth, JWT, X509 SOAP peut-être protégé par Basic Auth, WsSecurity (WSS), X509 Quelle est la mieux documentable/documentée ? SOAP : WSDL est souvent la seule source d’information (exhaustive), très lourd parfois REST : Swagger - en ligne (PayPal, Stripe), pas toujours facile de s’y retrouver
  21. Exemples d’utilisation en SOAP vs REST Appeler l’API d’OVH en

    SOAP ou en REST https://github.com/WsdlToPhp/PackageOvh https://github.com/ovh/php-ovh
  22. Encore beaucoup d’industries utilisent SOAP (legacy ou volonté) Le générateur

    de SDK PHP à partir de Swagger n’est pas mature Les générateurs de SDK PHP à partir de WSDL sont assez matures et plus nombreux Il n’y a pas de raison d’avoir de SOAP Il reste encore du boulot pour atteindre une vraie maturité sur REST Conclusion
  23. ProgrammableWeb : -92 Shipping APIs: FedEx, US Postal Service and

    UPS -239 Messaging APIs: Twilio SMS, Skype and Nexmo -39 Statistics APIs: Compete, Clicky and Cownt Us -96 Stocks APIs: Bloomberg, NASDAQ and E*TRADE -Is REST losing its flair - REST API Alternatives -API Anti-Patterns: How to Avoid Common REST Mistakes -52 Movies APIs: Rovi, Rotten Tomatoes and Internet Video Archive WsdlToPhp : -Some statistics Sources