1 of 53

PHP WebServices

Clase 1

Mauro Chojrin - mauro.chojrin@leewayweb.com

2 of 53

Qué es un WebService

  • Una forma de comunicar dos aplicaciones entre sí
  • Basado en intercambio HTTP
  • No provee GUI

Mauro Chojrin - mauro.chojrin@leewayweb.com

3 of 53

Para qué sirve

  • Aumentar el poder de una aplicación
  • Integrar aplicaciones desarrolladas en diferentes lenguajes

Mauro Chojrin - mauro.chojrin@leewayweb.com

4 of 53

Ventajas y desventajas

  • Implementación simple

  • Poco eficientes
  • Difíciles de securitizar

Mauro Chojrin - mauro.chojrin@leewayweb.com

5 of 53

XML-RPC

  • Protocolo simple
  • Funcionalidad limitada

Mauro Chojrin - mauro.chojrin@leewayweb.com

6 of 53

SOAP

  • Heredero de XML-RPC
  • Comunicación más compleja y potente
  • Incluye un lenguaje de descripción (WSDL)

Mauro Chojrin - mauro.chojrin@leewayweb.com

7 of 53

REST

  • Basado fuertemente en HTTP
  • Concepto central: recurso
  • No incluye lenguaje de descripción
  • Muy eficiente

Mauro Chojrin - mauro.chojrin@leewayweb.com

8 of 53

Elementos principales

  • eXtensible Markup Language
  • Simple Object Access Protocol
  • Web Service Description Language
  • Universal Discovery Description and Integration

Mauro Chojrin - mauro.chojrin@leewayweb.com

9 of 53

XML

  • Descripción de datos
  • Entidades
  • Nodos
  • Atributos

Mauro Chojrin - mauro.chojrin@leewayweb.com

10 of 53

Tipos de WebService

  • XML-RPC
  • SOAP
  • REST

Mauro Chojrin - mauro.chojrin@leewayweb.com

11 of 53

XML y PHP

  • Archivos de texto
  • SimpleXML

Mauro Chojrin - mauro.chojrin@leewayweb.com

12 of 53

SimpleXML

  • SimpleXMLElement
  • simplexml_load_string()
  • simplexml_load_file()
  • SimpleXMLElement()

Mauro Chojrin - mauro.chojrin@leewayweb.com

13 of 53

Navegación

  • Elementos del documento como propiedades de SimpleXMLElement
  • Atributos como arrays asociativos

<?php

//cargar un archivo XML

$lib = new simpleXMLElement( “libreria.xml”, NULL, true );

foreach ( $lib->libro as $libro){

echo $libro['isbn'] . "<br>\n";

echo $libro->titulo . "<br>\n";

echo $libro->autor . "<br>\n";

echo $libro->editorial . "<br>\n";

echo "<hr>";

}

Mauro Chojrin - mauro.chojrin@leewayweb.com

14 of 53

Navegación

  • children()
  • attributes()
  • getname()

Mauro Chojrin - mauro.chojrin@leewayweb.com

15 of 53

XPath

  • Lenguaje de consultas
  • xpath()

<?php

$lib = new simpleXMLElement( "libreria.xml", NULL, true );

$resultado = $lib->xpath( "/librería/libro/titulo" );

foreach( $resultado as $titulo ) {

echo $titulo . "<br>\n";

}

$resultado = $lib->libro[0]->xpath( "titulo" );

foreach( $resultado as $titulo ) {

echo $titulo . "<br>\n";

}

Mauro Chojrin - mauro.chojrin@leewayweb.com

16 of 53

Modificación

  • addChild()
  • addAttribute()

<?php

$lib = new simpleXMLElement( "libreria.xml", NULL, true );

$libro = $lib->addChild('libro');

$libro->addAttribute('isbn', '08128439284');

$libro-> addChild ('titulo', 'La guerra y la paz');

$libro-> addChild ('autor', 'Tolstoi');

$libro-> addChild ('editorial', 'La Flor');

Mauro Chojrin - mauro.chojrin@leewayweb.com

17 of 53

Salida

  • asXML()
  • Content-Type: text/xml

Mauro Chojrin - mauro.chojrin@leewayweb.com

18 of 53

DOM

  • Document Object Model
  • API para acceder a los objetos de un documento HTML o XML
  • DomDocument

Mauro Chojrin - mauro.chojrin@leewayweb.com

19 of 53

Herramientas

  • POSTMan (Extensión de Chrome)
  • Boomerang - SOAP & REST Client
  • FireBug (Extensión de FireFox)

Mauro Chojrin - mauro.chojrin@leewayweb.com

20 of 53

Aplicaciones SOA

  • Service Oriented Architecture
  • Enfoque de desarrollo de aplicaciones de software empresarial

Mauro Chojrin - mauro.chojrin@leewayweb.com

21 of 53

WebServices en PHP

  • Recursos para SOAP: http://php.net/manual/es/book.soap.php
  • Para REST se usan peticiones estándar
    • http://php.net/manual/es/function.file-get-contents.php

Mauro Chojrin - mauro.chojrin@leewayweb.com

22 of 53

Ejemplos de APIs

Mauro Chojrin - mauro.chojrin@leewayweb.com

23 of 53

PHP WebServices

Clase 2

Mauro Chojrin - mauro.chojrin@leewayweb.com

24 of 53

RSS

  • Formato basado en XML
  • Usado en sitios de actualización frecuente
  • Soporte a suscripciones

Mauro Chojrin - mauro.chojrin@leewayweb.com

25 of 53

Para qué sirve

  • Recibir novedades en forma inmediata
  • Mantener sistemas actualizados

Mauro Chojrin - mauro.chojrin@leewayweb.com

26 of 53

Ejemplo: noticias de Clarín (SimpleXML)

<?php

$doc = simplexml_load_file( "http://www.clarin.com/rss/lo-ultimo/" );

$channel = $doc->channel;

foreach($channel as $chnl)

{

//busco el elemento item

$item = $chnl->item;

foreach($item as $itemgotten) {

echo $itemgotten->description;

}

}

Mauro Chojrin - mauro.chojrin@leewayweb.com

27 of 53

Ejemplo: noticias de Clarín (DOM)

<?php

$doc = new DOMDocument();

$doc->load("http://www.clarin.com/rss/lo-ultimo/");

$channel = $doc->getElementsByTagName("channel");

foreach($channel as $chnl)

{

$item = $chnl->getElementsByTagName("item");

foreach($item as $itemgotten)

{

$describe = $itemgotten->getElementsByTagName("description");

$description = $describe->item(0)->nodeValue;

echo $description;

}

}

Mauro Chojrin - mauro.chojrin@leewayweb.com

28 of 53

ATOM

  • Menos utilizado
  • Más estructurado
  • Menos ambiguo

Mauro Chojrin - mauro.chojrin@leewayweb.com

29 of 53

Ejemplo de ATOM:

Mauro Chojrin - mauro.chojrin@leewayweb.com

30 of 53

Creación de un feed

  • Elementos obligatorios
    • Canal
    • Items

<?xml version="1.0" encoding="ISO-8859-1" ?>

<rss version="2.0">

<channel>

<title>El nombre de nuestro feed RSS</title>

<link>Dirección web en la que se encuentre nuestro RSS</link>

<description>Contenido que vas a ofrecer a los usuarios que lean el RSS</description>

<item>

<title>Título del artículo del RSS</title>

<link>Dirección Web a la que podemos ir para ampliar esta información</link>

<description>Contenido de esta información</description>

</item>

</channel>

</rss>

Mauro Chojrin - mauro.chojrin@leewayweb.com

31 of 53

Recursos RSS con PHP

Mauro Chojrin - mauro.chojrin@leewayweb.com

32 of 53

PHP WebServices

Clase 3

Mauro Chojrin - mauro.chojrin@leewayweb.com

33 of 53

SOAP

  • Simple Object Access Protocol
  • Comunicación entre sistemas remotos
  • Ideal para mensajes complejos
  • Basado en XML

Mauro Chojrin - mauro.chojrin@leewayweb.com

34 of 53

WSDL

  • Web Service Description Language
  • Definición de protocolo para comunicación SOAP
  • Basado en XML

Mauro Chojrin - mauro.chojrin@leewayweb.com

35 of 53

WSDL - Elementos

  • definitions
  • types
  • message
  • portType
  • binding
  • Más información en http://programacion.jias.es/2012/01/web-service-definicion-utilizacion-estructura-del-wsdl/

Mauro Chojrin - mauro.chojrin@leewayweb.com

36 of 53

SOAP con PHP

  • SOAPServer
  • SOAPClient

Mauro Chojrin - mauro.chojrin@leewayweb.com

37 of 53

SOAP con PHP - SOAPServer

  • Abstracción sobre SOAP/XML
  • Se basa en la existencia de un WSDL
  • Expone API Orientada a Objetos
    • setClass()
    • handle()

Mauro Chojrin - mauro.chojrin@leewayweb.com

38 of 53

SOAP con PHP - SOAPServer

<?php

class MySoapServer

{

function sumar($a, $b) {

return ($a + $b);

}

}

$server = new SoapServer("sumar.wsdl");

$server->setClass('MySoapServer');

$server->handle();

Mauro Chojrin - mauro.chojrin@leewayweb.com

39 of 53

SOAP con PHP - SOAPClient

  • Abstracción sobre SOAP/XML
  • Se basa en la existencia de un WSDL
  • Expone API Orientada a Objetos

Mauro Chojrin - mauro.chojrin@leewayweb.com

40 of 53

SOAP con PHP - SOAPClient

<?php

try

{

$client = new SoapClient(“http://localhost/ws/server.php?wsdl”);

$result = $client->sumar(5, 3);

}

catch( SoapFault $e )

{

echo $e->getMessage();

}

Mauro Chojrin - mauro.chojrin@leewayweb.com

41 of 53

SOAP con PHP - Modo no-WSDL

  • No se conoce el WSDL
  • No existe WSDL
  • No recomendable en integración de sistemas de diferentes proveedores

Mauro Chojrin - mauro.chojrin@leewayweb.com

42 of 53

SOAP con PHP - Modo no-WSDL

<?php

$options = array(

'location' => http://localhost/ws/server.php' ,

'uri' => ' http://localhost/ws/'

);

$client = new SoapClient(NULL, $options);

echo $client->imprimir();

echo "<hr>";

echo $client->suma(5,6);

Mauro Chojrin - mauro.chojrin@leewayweb.com

43 of 53

JSON

  • JavaScript Object Notation
  • Texto plano
  • Más simple que XML

{

"glossary": {

"title": "example glossary",

"GlossDiv": {

"title": "S",

"GlossList": {

"ID": "SGML",

"GlossSeeAlso": ["GML", "XML"]

},

}

}

}

}

Mauro Chojrin - mauro.chojrin@leewayweb.com

44 of 53

JSON con PHP

  • json_encode
  • json_decode

Mauro Chojrin - mauro.chojrin@leewayweb.com

45 of 53

PHP WebServices

Clase 4

Mauro Chojrin - mauro.chojrin@leewayweb.com

46 of 53

REST

  • Representational State Transfer
  • Comunicación entre sistemas remotos
  • Basado en HTTP
  • Uso intensivo de las URIs
  • Orientado a recursos

Mauro Chojrin - mauro.chojrin@leewayweb.com

47 of 53

REST vs. SOAP

  • Más bajo nivel
  • Más eficiente
  • No es “descubrible”
  • Más simple de testear

Mauro Chojrin - mauro.chojrin@leewayweb.com

48 of 53

Para qué sirve

  • Comunicación a través de APIs
  • Ajax
    • Encabezados HTTP (Content-type, Status Code)
    • JSON

Mauro Chojrin - mauro.chojrin@leewayweb.com

49 of 53

Verbos HTTP

  • GET
  • POST
  • PUT
  • DELETE

Mauro Chojrin - mauro.chojrin@leewayweb.com

50 of 53

REST con PHP

  • Lado cliente
    • curl
    • file_get_contents
  • Lado servidor
    • $_GET
    • $_POST
    • 'php://input'

Mauro Chojrin - mauro.chojrin@leewayweb.com

51 of 53

Ejemplo - Servidor PHP

<?php

$method = $_SERVER['REQUEST_METHOD'];

$resource = $_SERVER['REQUEST_URI'];

switch ($method) {

case 'GET':

// código para método GET

break;

case 'POST':

$arguments = $_POST;

// código para método POST

break;

case 'PUT':

parse_str(file_get_contents('php://input'), $arguments);

// código para método PUT

break;

case 'DELETE':

// código para método DELETE

break;

}

echo json_encode($response,true);

Mauro Chojrin - mauro.chojrin@leewayweb.com

52 of 53

Ejemplo - Cliente AJAX

$.ajax({

url: 'http://servidor.com/recurso', // url del recurso

type: "get", // podría ser get, post, put o delete.

data: {}, // datos a pasar al servidor, en caso de necesitarlo

success: function (r) {

// aquí trataríamos la respuesta del servidor

}

failure: function (r) {

// aquí trataríamos la respuesta del servidor

}

});

Mauro Chojrin - mauro.chojrin@leewayweb.com

53 of 53

JSON

  • JavaScript Object Notation
  • Texto plano
  • Más simple que XML

{

"glossary": {

"title": "example glossary",

"GlossDiv": {

"title": "S",

"GlossList": {

"ID": "SGML",

"GlossSeeAlso": ["GML", "XML"]

},

}

}

}

}

Mauro Chojrin - mauro.chojrin@leewayweb.com