Albert Jessurum
Albert Jessurumacilia.es
Albert Jessurumacilia.eschess.com
Albert Jessurumacilia.eschess.comMaracaibo, Venezuela
Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessu
Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessu
Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessuFan de Symfony
Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessuFan de Symfony
Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessuFan de Symfony
Guzzle
¿Que es Guzzle?
¿Que es Guzzle?
¿Que es Guzzle?• Cliente para realizar peticiones http
¿Que es Guzzle?• Cliente para realizar peticiones http• cURL
¿Que es Guzzle?• Cliente para realizar peticiones http• cURL• Conexiones persistentes
¿Que es Guzzle?• Cliente para realizar peticiones http• cURL• Conexiones persistentes• Peticiones paralelas
¿Que es Guzzle?• Cliente para realizar peticiones http• cURL• Conexiones persistentes• Peticiones paralelas• Plugins
¿Por que Guzzle?
¿Por que Guzzle?
¿Por que Guzzle?• Peticiones http en general
¿Por que Guzzle?• Peticiones http en general• API
¿Por que Guzzle?• Peticiones http en general• API• Scrapping
¿Por que Guzzle?• Peticiones http en general• API• Scrapping• Envio de datos/reportes (POST)
Alternativas
Alternativas
Alternativas• file_get_contents/fopen
Alternativas• file_get_contents/fopen• cURL
Alternativas• file_get_contents/fopen• cURL• pecl_http
Alternativas• file_get_contents/fopen• cURL• pecl_http• Zend_Http
Alternativas• file_get_contents/fopen• cURL• pecl_http• Zend_Http• Buzz
Proyectos que usan Guzzle
Proyectos que usan Guzzle
Proyectos que usan Guzzle• Drupal 8
Proyectos que usan Guzzle• Drupal 8• Goutte
Proyectos que usan Guzzle• Drupal 8• Goutte• Amazon AWS
Guzzle en menos de 1 minuto
Guzzle en menos de 1 minuto
Guzzle en menos de 1 minuto// Version >= 3.7
Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();
Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);
Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);
Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);...
Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);...
Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);...
Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);...
Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);...
Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);...
Guzzle HTTP Client
Guzzle HTTP Client
Guzzle HTTP Client• Clientes
Guzzle HTTP Client• Clientes• Requests• Sin body• Con body
Guzzle HTTP Client• Clientes• Requests• Sin body• Con body• Responses
Guzzle HTTP ClientClient Object
Client Object$client = new Client(https://api.github.com/test);// Absoluta$request = $client->get(https://api.github.com/t...
Guzzle HTTP ClientRequest Object
Request Object// Crear un método en especifico$client->createRequest(METODO, $uri, array $headers, $body, $options);// GET...
Request Object// Una petición simple:$request = $client->head(/path?id=123&nombre=abc);$response = $request->send();// Una...
Request Object$request = $client->createRequest(COPY, http://example.com/foo, array(Destination => http://test.com/bar,Ove...
Guzzle HTTP ClientResponse Object
Response Object$response = $client->get(http://www.amazon.com)->send();echo $response->getStatusCode();// 200echo $respons...
Response Object// Respuesta de la peticiónecho $response->getBody();// Si el formato es correcto:// Devuelve un array de l...
Plugins
Response Object// Envía una petición si, y otra no con el plugin:// UnaSiOtraNoPlugin$unaSiOtraNo = new UnaSiOtraNoPlugin(...
Plugins• Async plugin• Backoff retry plugin• HTTP Cache plugin• OAuth plugin• Cookie plugin• History plugin• Log plugin• MD...
PluginsAsync plugin
PluginsBackoff retry plugin
PluginsHTTP Cache Plugin
HTTP Cache Plugin
HTTP Cache Plugin
HTTP Cache Plugin• Chequea el HEAD del Request, para verificar el status.
HTTP Cache Plugin• Chequea el HEAD del Request, para verificar el status.
HTTP Cache Plugin• Chequea el HEAD del Request, para verificar el status.• Se puede crear una cache falsa
PluginsOAuth Plugin
OAuth Plugin
OAuth Plugin
OAuth Plugin• OAuth 1.0 (Twiiter)
OAuth Plugin• OAuth 1.0 (Twiiter)• OAuth 2.0 (Facebook)
OAuth Plugin• OAuth 1.0 (Twiiter)• OAuth 2.0 (Facebook)• OAuth2 en los planes pero sin fecha:( https://github.com/guzzle/g...
OAuth Plugin• OAuth 1.0 (Twiiter)• OAuth 2.0 (Facebook)• OAuth2 en los planes pero sin fecha:( https://github.com/guzzle/g...
OAuth Plugin• OAuth 1.0 (Twiiter)• OAuth 2.0 (Facebook)• OAuth2 en los planes pero sin fecha:( https://github.com/guzzle/g...
// Cargando el plugin OAuth$client = new Client(http://api.twitter.com/1.1);$oauth = new OauthPlugin(array(consumer_key =>...
Service Builder
Service Builder// Create cliente de twitter$client = TwitterClient::factory(array(consumer_key => ****,consumer_secret => ...
Service Builder// Crear un cliente desde un factory$builder = ServiceBuilder::factory(/ruta/a/config.json);$twitter = $bui...
Service Builder{"services": {"twitter_ajessu": {"class": "ajessuTwitterClient","params": {"consumer_key": "****","consumer...
Service Definition
Service Builder{"name": "string","apiVersion": "string|number","baseUrl": "string","description": "string","operations": {...
Service Builder{"includes":["connection.json"],"name": "IndividualMember","apiVersion": "0.1","description": "Individual M...
Service Builder{"name": "Connection","apiVersion": "0.1","description": "Connection Api for Emailvision","operations": {"O...
Service Builder$memberClient = DataIndividualClient::factory();// Get the token$openConnectionCommand = $memberClient->get...
Guzzle en silex
Guzzle en silex$app = new Application();$app->register(new GuzzleServiceProvider(), array(guzzle.services => /ruta/a/servi...
Guzzle en Symfony2
Guzzle en Symfony2
Guzzle en Symfony2• Varios bundles
Guzzle en Symfony2• Varios bundles• Mejor opción hoy: MisdGuzzleBundle( https://github.com/misd-service-development/guzzle...
Guzzle en Symfony2• Varios bundles• Mejor opción hoy: MisdGuzzleBundle( https://github.com/misd-service-development/guzzle...
Guzzle en Symfony2// app/AppKernel.phpclass AppKernel extends Kernel{// ...public function registerBundles(){$bundles = ar...
Guzzle en Symfony2// MyBundle/Resources/config/services.xml<service id="example.client" class="%guzzle.client.class%"><tag...
Guzzle en Symfony2$client = $this->get(example.client);// Service description:<service id="example.client.service_descript...
Gracias!Feedback: https://joind.in/8840Albert Jessurum@ajessugithub.com/ajessu
deSymfony 2013 Consumiendo APIs REST con Guzzle y Symfony2
deSymfony 2013 Consumiendo APIs REST con Guzzle y Symfony2
Upcoming SlideShare
Loading in …5
×

deSymfony 2013 Consumiendo APIs REST con Guzzle y Symfony2

6,715 views

Published on

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.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,715
On SlideShare
0
From Embeds
0
Number of Embeds
3,321
Actions
Shares
0
Downloads
72
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

deSymfony 2013 Consumiendo APIs REST con Guzzle y Symfony2

  1. 1. Albert Jessurum
  2. 2. Albert Jessurumacilia.es
  3. 3. Albert Jessurumacilia.eschess.com
  4. 4. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela
  5. 5. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessu
  6. 6. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessu
  7. 7. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessuFan de Symfony
  8. 8. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessuFan de Symfony
  9. 9. Albert Jessurumacilia.eschess.comMaracaibo, Venezuela@ajessugithub.com/ajessuFan de Symfony
  10. 10. Guzzle
  11. 11. ¿Que es Guzzle?
  12. 12. ¿Que es Guzzle?
  13. 13. ¿Que es Guzzle?• Cliente para realizar peticiones http
  14. 14. ¿Que es Guzzle?• Cliente para realizar peticiones http• cURL
  15. 15. ¿Que es Guzzle?• Cliente para realizar peticiones http• cURL• Conexiones persistentes
  16. 16. ¿Que es Guzzle?• Cliente para realizar peticiones http• cURL• Conexiones persistentes• Peticiones paralelas
  17. 17. ¿Que es Guzzle?• Cliente para realizar peticiones http• cURL• Conexiones persistentes• Peticiones paralelas• Plugins
  18. 18. ¿Por que Guzzle?
  19. 19. ¿Por que Guzzle?
  20. 20. ¿Por que Guzzle?• Peticiones http en general
  21. 21. ¿Por que Guzzle?• Peticiones http en general• API
  22. 22. ¿Por que Guzzle?• Peticiones http en general• API• Scrapping
  23. 23. ¿Por que Guzzle?• Peticiones http en general• API• Scrapping• Envio de datos/reportes (POST)
  24. 24. Alternativas
  25. 25. Alternativas
  26. 26. Alternativas• file_get_contents/fopen
  27. 27. Alternativas• file_get_contents/fopen• cURL
  28. 28. Alternativas• file_get_contents/fopen• cURL• pecl_http
  29. 29. Alternativas• file_get_contents/fopen• cURL• pecl_http• Zend_Http
  30. 30. Alternativas• file_get_contents/fopen• cURL• pecl_http• Zend_Http• Buzz
  31. 31. Proyectos que usan Guzzle
  32. 32. Proyectos que usan Guzzle
  33. 33. Proyectos que usan Guzzle• Drupal 8
  34. 34. Proyectos que usan Guzzle• Drupal 8• Goutte
  35. 35. Proyectos que usan Guzzle• Drupal 8• Goutte• Amazon AWS
  36. 36. Guzzle en menos de 1 minuto
  37. 37. Guzzle en menos de 1 minuto
  38. 38. Guzzle en menos de 1 minuto// Version >= 3.7
  39. 39. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();
  40. 40. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);
  41. 41. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);
  42. 42. Guzzle en menos de 1 minuto// Version >= 3.7GuzzleHttpStaticClient::mount();$response = Guzzle::get(http://desymfony.com);// Para un poco mas de control
  43. 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. 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. 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. 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. 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. 48. Guzzle HTTP Client
  49. 49. Guzzle HTTP Client
  50. 50. Guzzle HTTP Client• Clientes
  51. 51. Guzzle HTTP Client• Clientes• Requests• Sin body• Con body
  52. 52. Guzzle HTTP Client• Clientes• Requests• Sin body• Con body• Responses
  53. 53. Guzzle HTTP ClientClient Object
  54. 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. 55. Guzzle HTTP ClientRequest Object
  56. 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. 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. 58. Request Object$request = $client->createRequest(COPY, http://example.com/foo, array(Destination => http://test.com/bar,Overwrite => T));$response = $request->send();
  59. 59. Guzzle HTTP ClientResponse Object
  60. 60. Response Object$response = $client->get(http://www.amazon.com)->send();echo $response->getStatusCode();// 200echo $response->isSuccessful();// true$response->isRedirect();// false
  61. 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. 62. Plugins
  63. 63. Response Object// Envía una petición si, y otra no con el plugin:// UnaSiOtraNoPlugin$unaSiOtraNo = new UnaSiOtraNoPlugin();$client->addSubscriber($unaSiOtraNo);
  64. 64. Plugins• Async plugin• Backoff retry plugin• HTTP Cache plugin• OAuth plugin• Cookie plugin• History plugin• Log plugin• MD5 validator plugin• Mock plugin
  65. 65. PluginsAsync plugin
  66. 66. PluginsBackoff retry plugin
  67. 67. PluginsHTTP Cache Plugin
  68. 68. HTTP Cache Plugin
  69. 69. HTTP Cache Plugin
  70. 70. HTTP Cache Plugin• Chequea el HEAD del Request, para verificar el status.
  71. 71. HTTP Cache Plugin• Chequea el HEAD del Request, para verificar el status.
  72. 72. HTTP Cache Plugin• Chequea el HEAD del Request, para verificar el status.• Se puede crear una cache falsa
  73. 73. PluginsOAuth Plugin
  74. 74. OAuth Plugin
  75. 75. OAuth Plugin
  76. 76. OAuth Plugin• OAuth 1.0 (Twiiter)
  77. 77. OAuth Plugin• OAuth 1.0 (Twiiter)• OAuth 2.0 (Facebook)
  78. 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. 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. 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. 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. 82. Service Builder
  83. 83. Service Builder// Create cliente de twitter$client = TwitterClient::factory(array(consumer_key => ****,consumer_secret => ****,token => ****,token_secret => ****));
  84. 84. Service Builder// Crear un cliente desde un factory$builder = ServiceBuilder::factory(/ruta/a/config.json);$twitter = $builder->get(twitter);
  85. 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. 86. Service Definition
  87. 87. Service Builder{"name": "string","apiVersion": "string|number","baseUrl": "string","description": "string","operations": {},"models": {},"includes": ["string.php", "string.json"]}
  88. 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. 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. 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. 91. Guzzle en silex
  92. 92. Guzzle en silex$app = new Application();$app->register(new GuzzleServiceProvider(), array(guzzle.services => /ruta/a/servicios.json,));
  93. 93. Guzzle en Symfony2
  94. 94. Guzzle en Symfony2
  95. 95. Guzzle en Symfony2• Varios bundles
  96. 96. Guzzle en Symfony2• Varios bundles• Mejor opción hoy: MisdGuzzleBundle( https://github.com/misd-service-development/guzzle-bundle )
  97. 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. 98. Guzzle en Symfony2// app/AppKernel.phpclass AppKernel extends Kernel{// ...public function registerBundles(){$bundles = array(// ...new MisdGuzzleBundleMisdGuzzleBundle());}}
  99. 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. 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. 101. Gracias!Feedback: https://joind.in/8840Albert Jessurum@ajessugithub.com/ajessu

×