SlideShare una empresa de Scribd logo
1 de 62
Descargar para leer sin conexión
Hugo Hamon
@hhamon
Silex meets
REST and SOAP
What is Silex?
http://silex.sensiolabs.org
Why choosing Silex?
What’s inside?
The Silex
Philosophy
silex.phar
   cache/
    logs/
     src/
   tests/
  vendor/
     web/
Silex Mantra

namespace SymfonyComponentHttpKernel;

interface HttpKernelInterface
{
    (Response) function handle(Request $request);
}
Request Handling
require_once __DIR__.'/silex.phar';

$app = new SilexApplication();

$app->get('/hello/{name}', function($name) use($app) {
    return 'Hello '. $app->escape($name);
});

$app->run();
Request Handling
require_once __DIR__.'/silex.phar';

use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;

$app = new SilexApplication();

$app->get('/hello/{name}', function(Request $request) use($app) {
    $name = $request->attributes->get('name');
    return new Response('Hello '. $app->escape($name));
});
$app == DIC
Deploying REST
Web services
REpresentational
State
Transfer
Architecture
       style
Designing
REST APIs
$app->get('/events', function (Request $request) {

      $events = array(
          array('name' => 'OSIDays', 'venue' => 'Bangalore'),
          array('name' => 'PHP Tour', 'venue' => 'Lille'),
          array('name' => 'Confoo', 'venue' => 'Montreal'),
          // ...
      );

      return new Response(json_encode($events), 200, array(
          'Content-Type' => 'application/json'
      ));
});
$app->post('/event', function (Request $request) use ($app) {

      // Get POST data or 400 HTTP response
      if (!$data = $request->get('event')) {
          return new Response('Missing parameters.', 400);
      }

      // Persist data to the database
      $event = new Event()
      $event->title = $data['title'];
      $event->venue = $data['venue'];
      $event->save();

      // Trigger redirect to the newly created record URI
      return $app->redirect('/event/'. $event->id, 201);
});
$app->put('/event/{id}', function ($id) use ($app) {

      if (!$data = $request->get('event')) {
          return new Response('Missing parameters.', 400);
      }

      if (!$event = $app['event_manager']->find($id)) {
          return new Response('Event not found.', 404);
      }

      $event->title = $data['title'];
      $event->venue = $data['venue'];
      $event->save();

      return new Response('Event updated.', 200);
});
$app->delete('/event/{id}', function ($id) use ($app) {

      $event = $app['event_manager']->find($id);

      if (!$event) {
          return new Response('Event not found.', 404);
      }

      $event->delete();

      return new Response('Event deleted.', 200);
});
Advanced
routing
$app->get('/archive/{year}/{month}', function ($month, $year) {

     // ...

})

->bind('archives')            // Route name


->value('year', date('Y'))    // Default parameter value
->value('month', date('m'))


->assert('year', 'd{4}')     // Parameter format
->assert('month', 'd{2}');
Events
management
$app->before(function (Request $request) use ($app) {

      $user = $request->server->get('PHP_AUTH_USER');
      $pwd = $request->server->get('PHP_AUTH_PW');

      if (
            $app['api_user'] !== $user
            ||
            $app['api_pwd'] !== $pwd
      ) {
            return new Response('Unauthorized', 403);
      }
});
$app->after(function (Request $request, Response $response) {

      // Get URI parameter to determine requested output format
      $format = $request->attributes->get('format');

      switch ($format) {
          case 'xml':
              $response->headers->set('Content-Type', 'text/xml');
              break;
          case 'json':
              $response->headers->set('Content-Type', 'text/json');
              break;
          default:
              $response->headers->set('Content-Type', 'text/plain');
              break;
      }
});
Exception and
error handling
$app->error(function (Exception $e, $code) {

      switch ($code) {
          case 400:
              $message = 'Bad request.';
              break;
          case 404:
              $message = 'Page not found.';
              break;
          default:
              $message = 'Internal Server Error.';
      }

      return new Response($message, $code);
});
$app['debug'] = true;
$app->post('/event', function (Request $request) use ($app) {

      if (!$event = $request->get('event')) {
          $app->abort(400, 'Missing parameters.');
      }

      // ...

      return $app->redirect('/event/'. $event->id, 201);
});
Logging with
Monolog
use SilexProviderMonologServiceProvider;

$app->register(new MonologServiceProvider(), array(
    'monolog.logfile'    => __DIR__.'/../logs/app.log',
    'monolog.class_path' => __DIR__.'/../vendor/monolog/src',
));
if ($app['debug']) {

    $app['monolog']->addInfo('Testing the Monolog logging.');

    $app['monolog']->addDebug('Method foo() was called.');

    $app['monolog']->addWarning('Missing parameter "bar".');

    $app['monolog']->addError('Class Foo does not exist.');
}
Database
interactions
with Doctrine
use SilexProviderDoctrineServiceProvider;

$app->register(new DoctrineServiceProvider(), array(
    'db.options' => array(
        'driver' => 'pdo_mysql',
        'host'    => 'localhost',
        'user'    => 'root',
        'dbname' => 'event_demo',
    ),
    'db.dbal.class_path' => __DIR__.'/../vendor/doctrine-dbal/lib',
    'db.common.class_path' => __DIR__.'/../vendor/doctrine-common/lib',
));
$app->get('/events', function () use ($app) {

      $query = 'SELECT id, title, venue FROM events';

      $events = $app['db']->fetchAll($query);

      return new Response(json_encode($events));
});
Input validation
use SilexProviderValidatorServiceProvider;

$app->register(new ValidatorServiceProvider());
$app['validator']->validate($object);
namespace ConfeetModel;

use SymfonyComponentValidatorMappingClassMetadata;
use SymfonyComponentValidatorConstraintsNotBlank;
use SymfonyComponentValidatorConstraintsMaxLength;

class Event extends Model
{
  private $title;
  private $venue;

    static public function loadValidatorMetadata(ClassMetadata $metadata)
    {
      $metadata->addPropertyConstraint('title', new NotBlank());
      $metadata->addPropertyConstraint('title', new MaxLength(array('limit' => 50)));
      $metadata->addPropertyConstraint('venue', new NotBlank());
    }
}
$app->post('/event', function (Request $request) use ($app) {

      if (!$data = $request->get('event')) {
          $app->abort(400, 'Missing parameters.');
      }

      $event = new Event()
      $event->setTitle($data['title']);
      $event->setVenue($data['venue']);

      if (count($app['validator']->validate($event)) > 0) {
          $app->abort(400, 'Invalid parameters.');
      }

      $event->save();

      return $app->redirect('/event/'. $event->id, 201);
});
Template
engine
Twig

§ Fast
§ Concise and rich syntax
§ Automatic output escaping
§ Modern features
§ Extensible
use SilexProviderTwigServiceProvider;

$app->register(new TwigServiceProvider(), array(
    'twig.path'       => __DIR__.'/../views',
    'twig.class_path' => __DIR__.'/../vendor/twig/lib',
));
$app->get('/events.{format}', function ($format) use ($app) {

   $events = array(
       array('name' => 'OSIDays', 'venue' => 'Bangalore'),
       array('name' => 'PHP Tour', 'venue' => 'Lille'),
       array('name' => 'Confoo', 'venue' => 'Montreal'),
       // ...
   );

   return $app['twig']->render('events.'.$format.'.twig', array(
       'events' => $events,
   ));
})
->assert('format', 'xml|json');
<!-- views/events.xml.twig -->
<?xml version="1.0" encoding="utf-8" ?>
<events>
    {% for event in events %}
         <event>
             <title>{{ event.title }}</title>
             <venue>{{ event.venue }}</venue>
             <begin>{{ event.startAt }}</begin>
             <end>{{ event.endAt }}</end>
         </event>
    {% endfor %}
<events>
HTTP Caching
& ESI
Reverse Proxy Caching
use SilexProviderHttpCacheServiceProvider;

$app->register(new HttpCacheServiceProvider(), array(
    'http_cache.cache_dir' => __DIR__.'/../cache',
));
$app->get('/events', function () use ($app) {

      $events = array(
          array('name' => 'OSIDays', 'venue' => 'Bangalore'),
          // ...
      );

      $content = $app['twig']->render('events.twig', array(
          'events' => $events,
      ));

      return new Response($content, 200, array(
          'Cache-Control' => 'public, s-maxage=3600',
          'Surrogate-Control' => 'content="ESI/1.0"',
      ));
});
Edge Side Includes
<!-- views/events.twig -->
<?xml version="1.0" encoding="utf-8" ?>
<events>

   <esi:include src="/metadata" />

   <!-- ... -->

<events>
$app->get('/metadata', function () use ($app) {

      return new Response('<meta>...</meta>', 200, array(
          'Cache-Control' => 'public, s-maxage=600',
      ));
});
Functional
testing
Client
Crawler
PHPUnit
class EventApiTest extends SilexWebTestCase
{
    public function testRecentEvents()
    {
        $client = $this->createClient();
        $crawler = $client->request('GET', '/events.xml');

        $response = $client->getResponse();

        $this->assertTrue($response->isOk());
        $this->assertEquals(5, count($crawler->filter('event')));
        $this->assertRegExp('/OSIDays/', $response->getContent());
        ...
    }
}
Integrating
Zend Soap
$path = __DIR__.'/../vendor/zend/library';

$app['autoloader']->registerNamespace('Zend', $path);
use ZendSoapServer;
use ConfeetModelEventService;

$app->get('/gateway', function (Request $request) use ($app) {

      $server = new Server();
      $server->setObject(new EventService($app));
      $server->setReturnResponse(true);

      return new Response($server->handle(), 200, array(
          'Content-Type' => 'text/xml'
      ));
});
Ques%ons?	
  




 92-98, boulevard Victor Hugo
 92 115 Clichy Cedex, France
 trainings@sensio.com (+33 (0)140 998 211)

 sensiolabs.com - symfony.com – trainings.sensiolabs.com

Más contenido relacionado

La actualidad más candente

Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)
Fabien Potencier
 
Dependency Injection IPC 201
Dependency Injection IPC 201Dependency Injection IPC 201
Dependency Injection IPC 201
Fabien Potencier
 
News of the Symfony2 World
News of the Symfony2 WorldNews of the Symfony2 World
News of the Symfony2 World
Fabien Potencier
 

La actualidad más candente (20)

Lithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate FrameworksLithium: The Framework for People Who Hate Frameworks
Lithium: The Framework for People Who Hate Frameworks
 
Building Lithium Apps
Building Lithium AppsBuilding Lithium Apps
Building Lithium Apps
 
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo EditionLithium: The Framework for People Who Hate Frameworks, Tokyo Edition
Lithium: The Framework for People Who Hate Frameworks, Tokyo Edition
 
Models and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and HobgoblinsModels and Service Layers, Hemoglobin and Hobgoblins
Models and Service Layers, Hemoglobin and Hobgoblins
 
The State of Lithium
The State of LithiumThe State of Lithium
The State of Lithium
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DICDecoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
 
Dependency Injection IPC 201
Dependency Injection IPC 201Dependency Injection IPC 201
Dependency Injection IPC 201
 
The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016The IoC Hydra - Dutch PHP Conference 2016
The IoC Hydra - Dutch PHP Conference 2016
 
Command Bus To Awesome Town
Command Bus To Awesome TownCommand Bus To Awesome Town
Command Bus To Awesome Town
 
Decoupling the Ulabox.com monolith. From CRUD to DDD
Decoupling the Ulabox.com monolith. From CRUD to DDDDecoupling the Ulabox.com monolith. From CRUD to DDD
Decoupling the Ulabox.com monolith. From CRUD to DDD
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mocking
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
 
Doctrine MongoDB ODM (PDXPHP)
Doctrine MongoDB ODM (PDXPHP)Doctrine MongoDB ODM (PDXPHP)
Doctrine MongoDB ODM (PDXPHP)
 
Min-Maxing Software Costs
Min-Maxing Software CostsMin-Maxing Software Costs
Min-Maxing Software Costs
 
Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
Adding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsAdding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy Applications
 
Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010Symfony2 - WebExpo 2010
Symfony2 - WebExpo 2010
 
News of the Symfony2 World
News of the Symfony2 WorldNews of the Symfony2 World
News of the Symfony2 World
 

Destacado

Silex: From nothing to an API
Silex: From nothing to an APISilex: From nothing to an API
Silex: From nothing to an API
chrisdkemper
 
Designing for developers
Designing for developersDesigning for developers
Designing for developers
Kirsten Hunter
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
Hugo Hamon
 

Destacado (20)

Silex: From nothing to an API
Silex: From nothing to an APISilex: From nothing to an API
Silex: From nothing to an API
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHPIntroducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
 
Complex Sites with Silex
Complex Sites with SilexComplex Sites with Silex
Complex Sites with Silex
 
API 101 Workshop from APIStrat Conference
API 101 Workshop from APIStrat ConferenceAPI 101 Workshop from APIStrat Conference
API 101 Workshop from APIStrat Conference
 
Prototyping in the cloud
Prototyping in the cloudPrototyping in the cloud
Prototyping in the cloud
 
Quantifying fitness
Quantifying fitnessQuantifying fitness
Quantifying fitness
 
Monitor the quality of your Symfony projects
Monitor the quality of your Symfony projectsMonitor the quality of your Symfony projects
Monitor the quality of your Symfony projects
 
Liberating your data
Liberating your dataLiberating your data
Liberating your data
 
Designing for developers
Designing for developersDesigning for developers
Designing for developers
 
Développeurs, cachez-moi ça ! (Paris Web 2011)
Développeurs, cachez-moi ça ! (Paris Web 2011)Développeurs, cachez-moi ça ! (Paris Web 2011)
Développeurs, cachez-moi ça ! (Paris Web 2011)
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?
This stuff is cool, but...HOW CAN I GET MY COMPANY TO DO IT?
 
Speed up your developments with Symfony2
Speed up your developments with Symfony2Speed up your developments with Symfony2
Speed up your developments with Symfony2
 
Facebook appsincloud
Facebook appsincloudFacebook appsincloud
Facebook appsincloud
 
API First
API FirstAPI First
API First
 
Api 101
Api 101Api 101
Api 101
 
Liberating your data
Liberating your dataLiberating your data
Liberating your data
 
Symfony2 en pièces détachées
Symfony2 en pièces détachéesSymfony2 en pièces détachées
Symfony2 en pièces détachées
 
Symfony2 - extending the console component
Symfony2 - extending the console componentSymfony2 - extending the console component
Symfony2 - extending the console component
 

Similar a Silex meets SOAP & REST

Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friends
Michael Peacock
 

Similar a Silex meets SOAP & REST (20)

Bacbkone js
Bacbkone jsBacbkone js
Bacbkone js
 
Crafting beautiful software
Crafting beautiful softwareCrafting beautiful software
Crafting beautiful software
 
WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015WordPress Realtime - WordCamp São Paulo 2015
WordPress Realtime - WordCamp São Paulo 2015
 
Introduction to Zend Framework web services
Introduction to Zend Framework web servicesIntroduction to Zend Framework web services
Introduction to Zend Framework web services
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
 
BEAR DI
BEAR DIBEAR DI
BEAR DI
 
Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5Bootstrat REST APIs with Laravel 5
Bootstrat REST APIs with Laravel 5
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From Iusethis
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
 
PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2PHPUnit elevato alla Symfony2
PHPUnit elevato alla Symfony2
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
 
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
 Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011 Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
 
Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12Symfony components in the wild, PHPNW12
Symfony components in the wild, PHPNW12
 
Virtual Madness @ Etsy
Virtual Madness @ EtsyVirtual Madness @ Etsy
Virtual Madness @ Etsy
 
Forget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers CracowForget about Index.php and build you applications around HTTP - PHPers Cracow
Forget about Index.php and build you applications around HTTP - PHPers Cracow
 
Phpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friendsPhpne august-2012-symfony-components-friends
Phpne august-2012-symfony-components-friends
 
Forget about index.php and build you applications around HTTP!
Forget about index.php and build you applications around HTTP!Forget about index.php and build you applications around HTTP!
Forget about index.php and build you applications around HTTP!
 
Angular Tutorial Freshers and Experienced
Angular Tutorial Freshers and ExperiencedAngular Tutorial Freshers and Experienced
Angular Tutorial Freshers and Experienced
 
AngularJS - $http & $resource Services
AngularJS - $http & $resource ServicesAngularJS - $http & $resource Services
AngularJS - $http & $resource Services
 

Más de Hugo Hamon

Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
Hugo Hamon
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Hugo Hamon
 

Más de Hugo Hamon (6)

Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CI
 
Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec Symfony
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
 

Último

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Último (20)

From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 

Silex meets SOAP & REST