deSymfony 2013 Consumiendo APIs REST con Guzzle y Symfony2
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

deSymfony 2013 Consumiendo APIs REST con Guzzle y Symfony2

on

  • 3,393 views

Guzzle es un cliente HTTP que facilita de forma increíble el crear, consumir e interactuar con servicios web, como por ejemplo, la api REST de un servicio web como Twitter, Amazon AWS, Github, entre ...

Guzzle es un cliente HTTP que facilita de forma increíble el crear, consumir e interactuar con servicios web, como por ejemplo, la api REST de un servicio web como Twitter, Amazon AWS, Github, entre otros.

Nos ofrece completo control del estándar HTTP para la generación de un Request y nos permite de forma organizada manejar el Response y definir modelos sobre las respuestas para actuar mas facilmente sobre ellas.

En esta charla se introducirá como configurar la libreria de forma independiente en menos de 10 minutos, y como integrarlo en un proyecto de Symfony2 y Silex, para empezar a atacar APIs, se explicaran sus usos mas comunes, se hablara de proyectos que ya lo tienen incorporado (como Drupal, el Amazon AWS SDK para PHP, y la libreria Goutte, para hacer Webscraping, de Fabien Potencier, entre otras).

Se terminara con un ejemplo practico en dos proyectos de Acilia, para atacar a un servicio web (emailvision), para envíos de emails transaccionales y masivos de dos aplicaciones y posterior recopilación de reportes de dichos envíos, todo mediante llamadas y respuestas HTTP a una API REST.

Statistics

Views

Total Views
3,393
Views on SlideShare
1,920
Embed Views
1,473

Actions

Likes
1
Downloads
52
Comments
0

11 Embeds 1,473

http://librosweb.es 850
http://desymfony.com 546
http://www.desymfony.com 48
https://twitter.com 17
http://desymfony.local 5
http://librosweb.dev 2
http://lw.192.168.2.13.xip.io 1
http://www.librosweb.es 1
http://www.linkedin.com 1
http://webcache.googleusercontent.com 1
http://www.google.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

deSymfony 2013 Consumiendo APIs REST con Guzzle y Symfony2 Presentation Transcript

  • 1. Albert Jessurum
  • 2. Albert Jessurumacilia.es
  • 3. Albert Jessurumacilia.eschess.com
  • 4. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela
  • 5. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessu
  • 6. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessu
  • 7. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessuFan de Symfony
  • 8. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessuFan de Symfony
  • 9. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessuFan de Symfony
  • 10. Guzzle
  • 11. ¿Que es Guzzle?
  • 12. ¿Que es Guzzle?
  • 13. ¿Que es Guzzle?• Cliente para realizar peticiones http
  • 14. ¿Que es Guzzle?• Cliente para realizar peticiones http• cURL
  • 15. ¿Que es Guzzle?• Cliente para realizar peticiones http• cURL• Conexiones persistentes
  • 16. ¿Que es Guzzle?• Cliente para realizar peticiones http• cURL• Conexiones persistentes• Peticiones paralelas
  • 17. ¿Que es Guzzle?• Cliente para realizar peticiones http• cURL• Conexiones persistentes• Peticiones paralelas• Plugins
  • 18. ¿Por que Guzzle?
  • 19. ¿Por que Guzzle?
  • 20. ¿Por que Guzzle?• Peticiones http en general
  • 21. ¿Por que Guzzle?• Peticiones http en general• API
  • 22. ¿Por que Guzzle?• Peticiones http en general• API• Scrapping
  • 23. ¿Por que Guzzle?• Peticiones http en general• API• Scrapping• Envio de datos/reportes (POST)
  • 24. Alternativas
  • 25. Alternativas
  • 26. Alternativas• file_get_contents/fopen
  • 27. Alternativas• file_get_contents/fopen• cURL
  • 28. Alternativas• file_get_contents/fopen• cURL• pecl_http
  • 29. Alternativas• file_get_contents/fopen• cURL• pecl_http• Zend_Http
  • 30. Alternativas• file_get_contents/fopen• cURL• pecl_http• Zend_Http• Buzz
  • 31. Proyectos que usan Guzzle
  • 32. Proyectos que usan Guzzle
  • 33. Proyectos que usan Guzzle• Drupal 8
  • 34. Proyectos que usan Guzzle• Drupal 8• Goutte
  • 35. Proyectos que usan Guzzle• Drupal 8• Goutte• Amazon AWS
  • 36. Guzzle en menos de 1 minuto
  • 37. Guzzle en menos de 1 minuto
  • 38. Guzzle en menos de 1 minuto// Version >= 3.7
  • 39. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();
  • 40. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);
  • 41. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);
  • 42. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);// Para un poco mas de control
  • 43. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);// Para un poco mas de controluse GuzzleHttpClient;
  • 44. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);// Para un poco mas de controluse GuzzleHttpClient;
  • 45. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);// Para un poco mas de controluse GuzzleHttpClient;$client = new Client(http://desymfony.com);
  • 46. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);// Para un poco mas de controluse GuzzleHttpClient;$client = new Client(http://desymfony.com);$request = $client->get(/);
  • 47. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);// Para un poco mas de controluse GuzzleHttpClient;$client = new Client(http://desymfony.com);$request = $client->get(/);$response = $request->send();
  • 48. Guzzle HTTP Client
  • 49. Guzzle HTTP Client
  • 50. Guzzle HTTP Client• Clientes
  • 51. Guzzle HTTP Client• Clientes• Requests• Sin body• Con body
  • 52. Guzzle HTTP Client• Clientes• Requests• Sin body• Con body• Responses
  • 53. Guzzle HTTP ClientClient Object
  • 54. Client Object$client = new Client(https://api.github.com/test);// Absoluta$request = $client->get(https://api.github.com/test);// https://api.github.com/test// relativa (con slash)$request = $client->get(/users);// https://api.github.com/users// relativa (sin slash)$request = $client->get(users);// https://api.github.com/test/users// Configuración de la petición$client->setUserAgent(Test/123);
  • 55. Guzzle HTTP ClientRequest Object
  • 56. Request Object// Crear un método en especifico$client->createRequest(METODO, $uri, array $headers, $body, $options);// GET$client->get($uri, array $headers, $options);//HEAD$client->head($uri, array $headers, $options);//DELETE$client->delete($uri, array $headers, $body, $options);//POST$client->post($uri, array $headers, $postBody, $options);//PUT$client->put($uri, array $headers, $body, $options);//PATCH$client->patch($uri, array $headers, $body, $options);
  • 57. Request Object// Una petición simple:$request = $client->head(/path?id=123&nombre=abc);$response = $request->send();// Una petición con cuerpo adjunto$request = $client->post(http://test.com/upload)->addPostFiles(array(file => /ruta/a/documento.json));$response = $request->send();// Content-Type: application/json
  • 58. Request Object$request = $client->createRequest(COPY, http://example.com/foo, array(Destination => http://test.com/bar,Overwrite => T));$response = $request->send();
  • 59. Guzzle HTTP ClientResponse Object
  • 60. Response Object$response = $client->get(http://www.amazon.com)->send();echo $response->getStatusCode();// 200echo $response->isSuccessful();// true$response->isRedirect();// false
  • 61. Response Object// Respuesta de la peticiónecho $response->getBody();// Si el formato es correcto:// Devuelve un array de la respuesta json de la peticiónecho $response->json();// Devuelve un objeto SimpleXMLElement de la peticiónecho $response->xml();
  • 62. Plugins
  • 63. Response Object// Envía una petición si, y otra no con el plugin:// UnaSiOtraNoPlugin$unaSiOtraNo = new UnaSiOtraNoPlugin();$client->addSubscriber($unaSiOtraNo);
  • 64. Plugins• Async plugin• Backoff retry plugin• HTTP Cache plugin• OAuth plugin• Cookie plugin• History plugin• Log plugin• MD5 validator plugin• Mock plugin
  • 65. PluginsAsync plugin
  • 66. PluginsBackoff retry plugin
  • 67. PluginsHTTP Cache Plugin
  • 68. HTTP Cache Plugin
  • 69. HTTP Cache Plugin
  • 70. HTTP Cache Plugin• Chequea el HEAD del Request, para verificar el status.
  • 71. HTTP Cache Plugin• Chequea el HEAD del Request, para verificar el status.
  • 72. HTTP Cache Plugin• Chequea el HEAD del Request, para verificar el status.• Se puede crear una cache falsa
  • 73. PluginsOAuth Plugin
  • 74. OAuth Plugin
  • 75. OAuth Plugin
  • 76. OAuth Plugin• OAuth 1.0 (Twiiter)
  • 77. OAuth Plugin• OAuth 1.0 (Twiiter)• OAuth 2.0 (Facebook)
  • 78. OAuth Plugin• OAuth 1.0 (Twiiter)• OAuth 2.0 (Facebook)• OAuth2 en los planes pero sin fecha:( https://github.com/guzzle/guzzle/issues/319 )
  • 79. OAuth Plugin• OAuth 1.0 (Twiiter)• OAuth 2.0 (Facebook)• OAuth2 en los planes pero sin fecha:( https://github.com/guzzle/guzzle/issues/319 )
  • 80. OAuth Plugin• OAuth 1.0 (Twiiter)• OAuth 2.0 (Facebook)• OAuth2 en los planes pero sin fecha:( https://github.com/guzzle/guzzle/issues/319 )
  • 81. // Cargando el plugin OAuth$client = new Client(http://api.twitter.com/1.1);$oauth = new OauthPlugin(array(consumer_key => mi_key,consumer_secret => mi_string_secreto,token => mi_token,token_secret => mi_token_secreto));$client->addSubscriber($oauth);$request = $client->get(statuses/public_timeline.json);$response = $request->send();
  • 82. Service Builder
  • 83. Service Builder// Create cliente de twitter$client = TwitterClient::factory(array(consumer_key => ****,consumer_secret => ****,token => ****,token_secret => ****));
  • 84. Service Builder// Crear un cliente desde un factory$builder = ServiceBuilder::factory(/ruta/a/config.json);$twitter = $builder->get(twitter);
  • 85. Service Builder{"services": {"twitter_ajessu": {"class": "ajessuTwitterClient","params": {"consumer_key": "****","consumer_secret": "****","token": "****","token_secret": "****"}},"twitter_desymfony": {"class": "ajessuTwitterClient","params": {"consumer_key": "****","consumer_secret": "****","token": "****","token_secret": "****"}}}}$twitter_ajessu = $builder->get(twitter_ajessu);$twitter_desymfony = $builder->get(twitter_desymfony);
  • 86. Service Definition
  • 87. Service Builder{"name": "string","apiVersion": "string|number","baseUrl": "string","description": "string","operations": {},"models": {},"includes": ["string.php", "string.json"]}
  • 88. Service Builder{"includes":["connection.json"],"name": "IndividualMember","apiVersion": "0.1","description": "Individual Member Api for Emailvision","baseUrl": "{schema}://{server}/apimember/services/rest","operations": {"InsertOrUpdateMember": {"httpMethod": "POST","uri": "member/insertOrUpdateMember/{token}","summary": "Updates a user if it exists, otherwise it updates it","responseClass": "InsertOrUpdateMember","parameters": {"token": {"location": "uri","description": "Connection token","required": true},"user": {"location": "body","description": "User values in xml","required": true},"Content-Type": {"location": "header","default": "application/xml"}}}}}
  • 89. Service Builder{"name": "Connection","apiVersion": "0.1","description": "Connection Api for Emailvision","operations": {"OpenConnection": {"httpMethod": "GET","uri": "connect/open/{apiLogin}/{apiPassword}/{apiKey}","summary": "Opens the connection","responseClass": "OpenConnection","parameters": {"apiLogin": {"location": "uri","description": "API username","required": true},"apiPassword": {"location": "uri","description": "API password","required": true},"apiKey": {"location": "uri","description": "API secret key","required": true}}},...},"models": {"OpenConnection": {"type": "object","properties": {"token": {"location": "xml","type": "string","sentAs": "result"},"status": {"type": "int","location": "statusCode"}}},...}}
  • 90. Service Builder$memberClient = DataIndividualClient::factory();// Get the token$openConnectionCommand = $memberClient->getCommand(OpenConnection,array(apiLogin => *****,apiPassword => ****,apiKey => ‘*********’));$openConnectionResponse = $memberClient->execute($openConnectionCommand);$token = $openConnectionResponse[token];$body = EntityBody::factory(‘/foo/user.xml’);$updateUserCommand = $memberClient->getCommand(InsertOrUpdateMember,array(token => $token,user => $body));$memberClient->execute($updateUserCommand);// Close connection$closeConnectionCommand = $memberClient->getCommand(CloseConnection,array(token => $token));$memberClient->execute($closeConnectionCommand);
  • 91. Guzzle en silex
  • 92. Guzzle en silex$app = new Application();$app->register(new GuzzleServiceProvider(), array(guzzle.services => /ruta/a/servicios.json,));
  • 93. Guzzle en Symfony2
  • 94. Guzzle en Symfony2
  • 95. Guzzle en Symfony2• Varios bundles
  • 96. Guzzle en Symfony2• Varios bundles• Mejor opción hoy: MisdGuzzleBundle( https://github.com/misd-service-development/guzzle-bundle )
  • 97. Guzzle en Symfony2• Varios bundles• Mejor opción hoy: MisdGuzzleBundle( https://github.com/misd-service-development/guzzle-bundle )• Discusion (hace tres dias) = Vamos a unirlos!( https://github.com/misd-service-development/guzzle-bundle/issues/28 )k
  • 98. Guzzle en Symfony2// app/AppKernel.phpclass AppKernel extends Kernel{// ...public function registerBundles(){$bundles = array(// ...new MisdGuzzleBundleMisdGuzzleBundle());}}
  • 99. Guzzle en Symfony2// MyBundle/Resources/config/services.xml<service id="example.client" class="%guzzle.client.class%"><tag name="guzzle.client"/><argument>http://api.example.com/</argument><argument type="collection"><argument key="setting1">true</argument><argument key="setting2">false</argument></argument><call method="addSubscriber"><argument type="service" id="some_guzzle_plugin"/></call><call method="setUserAgent"><argument>My Guzzle client</argument><argument>true</argument></call><call method="setDescription"><argument type="service" id="example.client.service_description"/></call></service>
  • 100. Guzzle en Symfony2$client = $this->get(example.client);// Service description:<service id="example.client.service_description"class="%guzzle.service_description.class%"factory-class="%guzzle.service_description.class%"factory-method="factory"><argument>%path.to.my.service_description.file%</argument></service>
  • 101. Gracias!Feedback: https://joind.in/8840Albert Jessurum@ajessugithub.com/ajessu