Slide 1

Slide 1 text

SOAP vs REST Mikaël DELSOL 19 Décembre 2017 AFUP BORDEAUX vs

Slide 2

Slide 2 text

Disclaimer Consommation Création

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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.

Slide 5

Slide 5 text

Le WSDL Contient à minima :   : mode d’envoi de la requête (HTTP POST, HTTP GET, SOAP)  : les services disponibles  : point d’entrée associé à une adresse unique

Slide 6

Slide 6 text

Un message SOAP L’entête est optionel http://schemas.xmlsoap.org/soap/envelope/ SOAP-ENV : enveloppe SOAP-ENV : entête SOAP-ENV : corps 12 89

Slide 7

Slide 7 text

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 12 89 Corps

Slide 8

Slide 8 text

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 101 Corps

Slide 9

Slide 9 text

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 !)

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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) [ 'book' => '\\My\\Namespace\\Book', ], )); $result = $client->getBooks(); // peut aussi être appelé comme ça : $client->__call('getBooks');

Slide 12

Slide 12 text

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 soap_defencoding = 'UTF-8'; $client->decode_utf8 = false; $data = []; // Calls $result = $client->call($action, $data);

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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 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();

Slide 15

Slide 15 text

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 method1(10); // $result2 is a float $result2 = $client->method2(22, 'some string');

Slide 16

Slide 16 text

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…

Slide 17

Slide 17 text

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. 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

Slide 18

Slide 18 text

phpro/soap-client - open source Génère les classes utiles Installation : composer require phpro/soap-client Plusieurs options de génération Middlewares 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

Slide 19

Slide 19 text

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 :

Slide 20

Slide 20 text

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 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();

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Statistiques SOAP vs REST source : www.programmableweb.com

Slide 23

Slide 23 text

Demandes de génération de SDK PHP SOAP Source : wsdltophp.com/About-this-website/Some-statistics

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Merci de votre attention Sources :

Slide 28

Slide 28 text

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