You are on page 1of 13

15/6/2015

Web Services con PHP - Manual completo

WebServicesconPHP
M anualpor:De s arrolloWe b.com
"Tumejorayudaparaaprenderahacerw ebs"

Ve rs inonline :
http://w w w .desarrollow eb.com/manuales/61

IntroduccinalosWebServicesenPHP
ElpresenteartculoestadirigidoalaspersonasqueyaposeenconocimientossobreInternetyprogramaciny
quierencomenzaraconocerelmundodeloswebservices(serviciosweb).
Cmoestaestructuradoelartculo?
ComenzaremosdandounaintroduccinaloquesonlosWebServices(ServiciosWeb),luegodefiniremoslos
elementosquelocomponen,yalfinalizarveremosunejemplodecmoutilizarunwebservicepormediode
NuSOAP,paraelcualutilizaremosdosarchivosPHP.
Enelapndicepuedenencontrarelcdigodelosdosarchivosqueconsumenelwebserviceparapoderverlosen
lnea,obajarloscomprimidos(ZIP) .Elarchivocomprimidotambinproveedeotrosarchivosdesoporte.
Introduccin:
AntesdecomenzarexplicandoNuSoap,creoqueesconvenienterealizarunaintroduccinaloquesonlos
ServiciosWeb,yparaestodebemoscomenzarconladefinicindeWebService.
WebService:
Esunsistemasoftwarediseadoparasoportarlainteroperabilidadmquinamquinaatravsdeunared.Este
tieneunainterfazdescriptaenunformatoquepuedeserprocesadoporunamquina(especficamenteWSDL,que
veremosmsadelante).OtrossistemasinteractanconelWebserviceutilizandomensajesSOAPloscualesse
encuentranestablecidospreviamente.
EntoncespodramosdecirqueunWebServiceesunacomunicacinpormediodemensajesSOAP(sonmensajes
especialesquemsadelanteveremosdetenidamente)entrediferentesequiposatravsdeunared.
AhorapasaremosadefinirloselementosquecomponenalosWebServices,paraluegovercomoellosestan
interrelacionados.
QuesXML,SOAP,WSDL,UDDI?
ParaconocercmoserealizaelintercambiodemensajesenlosWebServicesdebemosprimerosabercualesson
loselementosfundamentalesquelocomponen.EstossonelXML,SOAP,WSDL,yUDDI.
XMLeXtensibleMarkupLanguage:
EsunsubconjuntosimplificadodelSGMLelcualfuediseadoprincipalmenteparadocumentosWeb.Dejaalos
diseadorescrearsuspropias
etiquetas
o"tags"(Ej:<libro>),habilitandoladefinicin,transmisin,validacin,yla
interpretacindedatosentreaplicacionesyentreorganizaciones.Unpuntoqueconsideroqueesimportanteaclarar
esqueelHTMLyelXMLtienenfuncionesdiferentes.ElHTMLtieneporobjetomostrarinformacin,mientrasqueel
XMLseocupadelainformacinpropiamentedicha(elcontenido).Esteconceptoesimportantetenerloencuenta,
yaquemuchaspersonasalescucharsobreXMLpiensanqueeselsucesordeHTML.
EjemplodeundocumentoXMLsobreinformacindeautos:
<?xml version="1.0" encoding="UTF-8"?>
<vehiculos>
<coche>
<marca>Toyota</marca>
http://www.desarrolloweb.com/manuales/61/imprimir.php

1/13

15/6/2015

Web Services con PHP - Manual completo

<modelo>Corolla</modelo>
<fechaCompra>2002</fechaCompra>
</coche>
<coche>
<marca>Honda</marca>
<modelo>Civic</modelo>
<fechaCompra>2003</fechaCompra>
</coche>
</vehiculos>

Seguramenteestetipodearchivosnoseaunanovedadparalamayoradelosqueleanesteartculo,yaque
muchosdocumentosenInternetestnenformatoXML.Igualmenteexplicaremosbrevementelasseccionesdel
mismo:
<?xmlversion="1.0"encoding="UTF8"?>
TododocumentoXMLdebecomenzarindicandoqueesundocumentoXML,laversindelmismoysucodificacin.Esporesoquese
utilizaeltag<?xml....?>.Todosloselementosapartirdeaqusondefinidosporelusuario.
<vehiculos>
Luegoseindicauntagraiz(<vehiculos>)elcualcontendralosdemselementos.EscomoenHTMLeltag<HTML>..</HTML>,que
dentrodeelseencuentranlosdemstags.Seloconocegeneralmentecomorootdeldocumento.
<coche>
Luegodefinimosuntag<coche>elcualcontendruncocheenparticular(enestecasosoloincorpore3caractersticasdeuncoche:
marca,modelo,yfechadecompra).
<marca>Toyota</marca>
<modelo>Corolla</modelo>
<fechaCompra>2002</fechaCompra>
Sedefinen3tags(marca,modelo,yfechaCompra),loscualescontienenlosdatosparauncocheenparticular.
<vehiculos>
<coche>
<marca>..</marca>
<modelo>..</modelo>
<fechaCompra>..</fechaCompra>
</coche>
</vehiculos>
Eneldocumentopodemosapreciarquetodoslostagsquesonabiertos<marca>debensercerrados</marca>.Estoesunaexigenciadel
XML.

Sepuedenanidartags<coche><marca></marca>
..</coche>.Marcaestadentrodeltagcoche.ElXMLprovee
muchasotrasposibilidadescomopuedeserquelasetiquetastenganatributos(<cochecolor="rojo">..</coche>),
perononosdetendremosenellasyaquelaideaessimplementeofrecerlosconceptosbsicosparaconocerde
quesetrataelmundodelosWebServices.

SOAP.SimpleObjectAccessProtocol
EsunprotocoloquepermitelacomunicacinentreaplicacionesatravsdemensajespormediodeInternet.Es
independientedelaplataforma,ydellenguaje.EstabasadoenXMLyeslabaseprincipaldelosWebServices.Los
mensajesSOAPsondocumentoXMLpropiamentedicho,peroestoloveremosmsadelantecuandoveamosun
ejemplodeunmensajeSOAP.
Veamoscomoeslaestructurabsicadelprotocoloylacorrespondienteexplicacin:
<?xmlversion="1.0"?>
<soap:Envelopexmlns:soap="http://w w w .w 3.org/2001/12/soapenvelope"
Soap:encodingStyle="http://w w w .w 3.org/2001/12/soapencoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
http://www.desarrolloweb.com/manuales/61/imprimir.php

2/13

15/6/2015

Web Services con PHP - Manual completo

</soap:Fault>
</soap:Body>
</soap:Envelope>

Explicacindelcdigoanterior:
<?xmlversion="1.0"?>
ComopodemosverenestalineaSOAPesundocumentoXML,ycomotal,debecomenzarconeltag<?xml
.?>ylaversin
correspondiente.
<soap:Envelope
Aquseindicaquecomienzaelenvelope(sobre)delmensaje
xmlns:soap="http://w w w .w 3.org/2001/12/soapenvelope"
UnmensajeSOAPdebecontenersiempreunelementoenvelopeasociadoconelnamespace(espaciodenombres)
http://w w w .w 3.org/2001/12/soapenvelope
Soap:encodingStyle="http://w w w .w 3.org/2001/12/soapencoding">
Enestalnealoquesehaceesindicardondeseencuentrandefinidoslostiposdedatosutilizadoseneldocumento.
<soap:Header>
EstalneaindicaelcomienzodelHeader(encabezado).Enestaseccinseincluyeinformacinespecficadelmensaje,comopuedeserla
autenticacin.
</soap:Header>
ComotododocumentoXMLlostagsquesonabiertosdebensercerrados,estalneaindicalafinalizacindelHeader(encabezado).
<soap:Body>
Aqucomienzaelcuerpodelmensaje,enestaseccinseincorporatodalainformacinnecesariaparaelnodofinal.Porejemplo,los
parmetrosparalaejecucin,olarespuestaaunapeticin.
<soap:Fault>
Cualquiertipodefalloqueseproduzcasernotificadoenestaseccin.Lacualestacontenidadentrodelcuerpodelmensaje.
</soap:Fault>
CierredelaseccinFault.
</soap:Body>
Indicaelfinaldelcuerpodelmensaje.
</soap:Envelope>
FindelmensajeSOAP.

WSDLyUDDI
WSDLWebServicesDescriptionLanguage
EsunprotocolobasadoenXMLquedescribelosaccesosalWebService.Podriamosdecirqueeselmanualde
operacindelwebservice,porquenosindicacualessonlasinterfacesqueproveeelServiciowebylostiposde
datosnecesariosparalautilizacindelmismo.
VeamosunejemplodeundocumentoWSDL:

http://www.desarrolloweb.com/manuales/61/imprimir.php

3/13

15/6/2015

Web Services con PHP - Manual completo

<?xml version="1.0">
<definitions>
<types>
...
</types>
<message>
...
</message>
<portType>
...
</portType>
<binding>
...
</binding>
</definitions>

Explicacindelcdigoanterior:
<?xmlversion="1.0">

EsteesotrodocumentoXML,esporestoquedebecomenzarconeltag<?xml..?>

<definitions>

Comienzodeldocumento,estetagagrupaatodoslosdems.

<types>

SedefinenlostiposdedatosutilizadosenelWebService.

</types>

Findeladefinicindetipos.

<message>

Sedefinenlosmtodosyparmetrospararealizarlaoperacin.Cadamessagepuedeconsistirenunao
mspartes(parmetros).

</message>

Findeladefinicindelosparmetros.

<portType>

Estaseccineslamsimportante,yaquesedefinenlasoperacionesquepuedenserrealizadas,ylos
mensajesqueinvolucran(porejemploelmensajedepeticinyelderespuesta).

</portType>

Findeladefinicindelasoperacionesymensajes.

<binding>

SedefinenelformatodelmensajeydetallesdelprotocoloparacadaportType.

</binding>

FindeladefinicindelformatodelmensajeydetallesdelprotocoloparacadaPortType.

</definitions>

FindeldocumentoWSDL

UDDIUniversalDiscoveryDescriptionandIntegration
EsunmodelodedirectoriosparaWebServices.Esunaespecificacinparamantenerdirectoriosestandarizadosde
informacinacercadelosWebServices,suscapacidades,ubicacin,yrequerimientosenunformatoreconocido
universalmente.UDDIutilizaWSDLparadescribirlasinterfacesdelosWebServices.
EsunlugarenelcualpodemosbuscarcualessonlosServicioswebdisponibles,unaespeciededirectorioenel
cualpodemosencontrarlosWebServicespublicadosypublicarlosWebServicesquedesarrollemos.
http://soapclient.com/uddisearch.html
http://uddi.org/find.html

HistoriadelosWebServices
LosServiciosWebsurgieronanteunanecesidaddeestandarizarlacomunicacinentredistintasplataformas(PC,
Mainframe,Mac,etc.)ylenguajesdeprogramacin(PHP,C#,Java,etc.).
Anteriormentesehabanrealizadointentosdecrearestndaresperofracasarononotuvieronelsuficientexito,
http://www.desarrolloweb.com/manuales/61/imprimir.php

4/13

15/6/2015

Web Services con PHP - Manual completo

algunosdeellossonDCOMyCORBA,porserdependientesdelaimplementacindelvendedorDCOMMicrosoft,
yCORBAORB(apesarqueCORBAdemltiplesvendedorespuedenoperarentresi,hayciertaslimitacionespara
aplicacionesdenivelesmsaltosenloscualessenecesiteseguridadoadministracindetransacciones).
OtrogranproblemaesquesehacausodeRPC(RemoteProcedureCall)pararealizarlacomunicacinentre
diferentesnodos.Esto,ademsdepresentarciertosproblemasdeseguridad,tieneladesventajadequesu
implementacinenunambientecomoesInternet,escasiimposible(muchosfirewallsbloqueanestetipode
mensajes,loquehaceprcticamenteimposibleadoscomputadorasconectadasporInternetcomunicarse).
LosWebServicessurgieronparafinalmentepoderlograrlatanesperadacomunicacinentrediferentesplataformas.
Enlaactualidadmuchossistemaslegacyestnpasandoaserwebservices.
Esporestoqueen1999secomenzaplantearunnuevoestndar,elcualterminarautilizandoXML,SOAP,
WSDL,yUDDI.
LosWebservicespuedensersoloutilizadosconHTTP?
ApesardemucholimitarelusodelosWebservicesalprotocoloHTTP,losWebservicesnofueronpensadospara
unprotocoloenparticular,esdecir,nadanosimpideutilizarSOAPsobrealgnotroprotocolodeInternet(SMTP,
FTP,etc.).
SeutilizaprincipalmenteHTTPporserunprotocoloampliamentedifundidoyqueseencuentramenosrestringido
porfirewalls(generalmentesebloqueanpuertoscomoelFTP,peroelHTTPesmuyprobablequenoeste
bloqueado).

ComenzamosautilizarNuSOAP
EstenoeraunartculodeNuSOAP?
Si,esteesunartculodecomoconstuirWebServicesdesdePHPconNuSOAP,peroantesdebadaruna
introduccinaloquesonlosWebservicesycualessonlaspartesqueloscomponen.
Creoquesiempreesinteresanteynecesariopodersaberquehaydetrsdebambalinas,parapoderaprovecharal
mximolasherramientas,oproductos,oservicios,etc.
QueesNuSOAP?
NuSOAPesunkitdeherramientas(ToolKit)paradesarrollarWebServicesbajoellenguajePHP.Estcompuesto
porunaseriedeclasesquenosharnmuchomsfcileldesarrollodeWebServices.Proveesoporteparael
desarrollodeclientes(aquellosqueconsumenlosWebServices)ydeservidores(aquellosquelosproveen).
NuSOAPestbasadoenSOAP1.1,WSDL1.1yHTTP1.0/1.1
NuSOAPeselnicosoporteparaWebServicesenPHP?
No,noeselnico,existenotros,peroesunodelosqueestnenunafasededesarrollomuchomsavanzada.Sin
irmslejos,PHPapartirdesuversin5comienzaadarsoporteparaSOAP,peroanestenfaseexperimental.
PorquNuSOAPynootro?
1. Estenunafasemaduradedesarrollo.
2. Nonecesitamdulosadicionales.
3. Esmuyfcilsuinstalacinyuso
CmoinstaloNuSOAP?
Lainstalacinesbastantesencilla,slobastairalapaginaensourceforgedeNuSOAP
http://sourceforge.net/projects/nusoap/ybajarelarchivocomprimido(esun.zip).
Lodescomprimimosenundirectoriodenuestroservidorweb(comopuedeser/libqueeseldirectoriopordefault),y
http://www.desarrolloweb.com/manuales/61/imprimir.php

5/13

15/6/2015

Web Services con PHP - Manual completo

listo,yapodemoshacerusodeNuSOAP.

ComenzamosautilizarNuSOAPII
Comolousamos?
PararesponderaestapreguntanohaynadamejorqueunejemplodeutilizacindeNuSOAP,elcualnosayudar
tambinaterminardeverlosconceptosmencionadosanteriormente(SOAP,WSDL,etc.).
DecidiralapginadeXMethods ybuscaralgnservicioquepuedaseraplicableporpersonasdetodoelmundo,y
quenoestlimitadoalosEstadosUnidos.BuscandoentregrancantidaddeWebServicesdeCotizaciones,o
datosespecficosdelosEstadosUnidos,encontrunoquepodaserimplementadoencualquierpas,yeranims
nimenosquelosdatosdelclimaparatodoelmundo.EsteWebServicetiene9mtodosquepodemosutilizar
(todosellosseencuentrandefinidosenelarchivoWSDLqueseencuentraen
http://live.capescience.com/w sdl/GlobalWeather.w sdl.Losmtodosson:getStation(),isValidCode(),listCountries(),
searchByCode(),searchByCountry(),searchByLocation(),searchByName(),searchByRegion(),getWeatherReport().
ParaelejemplosoloutilizareelmtodosearchByCountry()ygetWeatherReport().
Enelejemploexistendosarchivos:
seleccionarLocalidad.php:elcualnospermitirseleccionarunalocalidaddadounpas(elpasestadadoporelvalor
delavariable$sPais).EstearchivoPHPutilizaelmtododelWebServicesearchByCountry()
mostrarPronostico.php:elcualmostraraelpronsticoparalalocalidadseleccionada.EstearchivoPHPutilizael
mtododelWebServicegetWeatherReport().
Siqueremosverunlistadodelosserviciospublicadospodemosiraestapgina:CapeScience
EnestapginanospermitenprobarlosmtodosdelosWebServicesenlnea,sinnecesidaddeunclienteSOAP,
estonosesdeutilidadprincipalmenteparavercomofuncionacadaunodelosmtodos.
Comomencioneanteriormente,todalainformacindelWebServiceseencuentradefinidadentrodeldocumento
WSDL,paraesteWebserviceseencuentradefinidaenCapeScience.
Estedocumentoenparticulartiene425lneas,porloquelalecturadelmismoesbastantetediosa.
NovoyaexplicartodoelarchivoWSDL,sinoquesimplementemedetendrenlaslneasquesondeimportancia
paranuestraaplicacin(lasquehacenreferenciaalosmetodossearchByCountry()ygetWeatherReport()).Ahora
veamosdondeseencuentranlasdefinicionesdelosmtodosdentrodelarchivo:
MensajesdesearchByCountry:entrelaslineas277a282podemosapreciarqueseencuentralosiguiente:
277.<messagename="searchByCountryResponse">
278.<partname="return"type="xsd1:ArrayOfStation"/>
279.</message>
280.<messagename="searchByCountry">
281.<partname="country"type="xsd:string"/>
282.</message>

SearchByCountry:comencemosporlalnea280ydejaremosparadespuslaslneas277a279.
280.<messagename="searchByCountry">

EnestalneaseindicaqueexisteunmtodollamadosearchByCountry,queeselmtodoqueestbamos
buscando.
281.<partname="country"type="xsd:string"/>

Aqusedefinequeexisteunparmetroparadichomtodoquesellama
country
(pas)yesdeltipostring.
282.</message>

FindelmtodoseachByCountry
http://www.desarrolloweb.com/manuales/61/imprimir.php

6/13

15/6/2015

Web Services con PHP - Manual completo

Ejemplodeunmensajerealconelparmetrocountryseteadoen
argentina
:
<nu:searchByCountry>
<countryxsi:type="xsd:string">argentina</country>
</nu:searchByCountry>

SearchByCountryResponse:AhoraanalicemoselmtodosearchByCountryResponse,comosunombreindica,es
larespuestaalmetodosearchByCountry.EsdecircuandoinvocamosasearchByCountry,elservidornos
responderconunmensajeconelformatodesearchByCountryResponse.Lasrespuestas,generalmente,tienen
anexadoalfinalResponsealnombredelmtodo(estoseepecificaenelportType).
277.<messagename="searchByCountryResponse">

EstalneanosindicaqueesunarespuestaalmtodosearchByCountry.
278.<partname="return"type="xsd1:ArrayOfStation"/>

Elmtodonosdevuelveunavariable
return
lacualesdeltipoArrayOfSation.Comovimosanteriormente,los
documentosWSDLpuedendefinirsuspropiostiposdedatos,ArrayOfStationesuntipodedatosdefinidoeneste
WSDL.VermsadelanteladefinicindeltipodedatosArrayOfStation.
279.</message>

FindelmtodosearchByCountryResponse.
ComovimosanteriormentesehacereferenciaaunArrayOfStation,paraverdequesetrataestodebemosbuscar
estetipodedatosdentrodelarchivoWSDL.Enlaslneascomprendidasente148y157,podemosverquesedefine
estetipodedatos.
148.<xsd:complexTypename="ArrayOfStation">
149.<xsd:complexContent>
150.<xsd:restrictionbase="SOAPENC:Array">
151.<xsd:sequence>
152.<xsd:elementmaxOccurs="unbounded"minOccurs="0"name="item"type="xsd1:Station"/>
153.</xsd:sequence>
154.<xsd:attributeref="SOAPENC:arrayType"w sdl:arrayType="xsd1:Station[]"/>
155.</xsd:restriction>
156.</xsd:complexContent>
157.</xsd:complexType>
148.<xsd:complexTypename="ArrayOfStation">

Enestalneapodemosverquesedefineuntipodedatoscomplejo(complexType)conelnombrede
ArrayOfStation
,
eltipodedatosquebuscbamos.
149.<xsd:complexContent>
150.<xsd:restrictionbase="SOAPENC:Array">
151.<xsd:sequence>

Indicamosqueesunelementocomplejo(array).
152.<xsd:elementmaxOccurs="unbounded"minOccurs="0"name="item"type="xsd1:Station"/>

Estalneaeslaquemsnosinteresa,yaqueseindicaprecisamentecomoestacompuestoelarray.Nosdiceque
tieneunmnimodeocurrenciasde0(MinOccurs=
0
),esdecir,quepuedenotenerelementos.Unmximode
ocurrenciasnolimitado(maxOccurs=
unbounded
),esdecirquepodemostenertodosloselementosquequeramos.
Yalfinalizarnosindicaeltipodedatosdelarray,quees
Station
.Pordesgraciaahoratenemosqueverquetipode
datosesStation.Comopodemosverundatosedefineapartirdeotro,hastallegaralostiposdedatosbsicos.
153.</xsd:sequence>

Secierranlostagsanteriormenteabiertos.
154.<xsd:attributeref="SOAPENC:arrayType"w sdl:arrayType="xsd1:Station[]"/>

Terminamosdedefinirelarray.
155.</xsd:restriction>156.</xsd:complexContent>157.</xsd:complexType>

Secierranlosdemstagsquefueronabiertos.
Nosquedabapendientedefinireltipodedatos
Station
,nuevamente,albuscarenelcdigoencontramosentrelas
lneas134a147ladefinicindeestetipodedatos.
http://www.desarrolloweb.com/manuales/61/imprimir.php

7/13

15/6/2015

Web Services con PHP - Manual completo

134.<xsd:complexTypename="Station">
135.<xsd:sequence>
136.<xsd:elementmaxOccurs="1"minOccurs="1"name="icao"nillable="true"type="xsd:string"/>
137.<xsd:elementmaxOccurs="1"minOccurs="1"name="w mo"nillable="true"type="xsd:string"/>
138.<xsd:elementmaxOccurs="1"minOccurs="1"name="iata"nillable="true"type="xsd:string"/>
139.<xsd:elementmaxOccurs="1"minOccurs="1"name="elevation"type="xsd:double"/>
140.<xsd:elementmaxOccurs="1"minOccurs="1"name="latitude"type="xsd:double"/>
141.<xsd:elementmaxOccurs="1"minOccurs="1"name="longitude"type="xsd:double"/>
142.<xsd:elementmaxOccurs="1"minOccurs="1"name="name"nillable="true"type="xsd:string"/>
143.<xsd:elementmaxOccurs="1"minOccurs="1"name="region"nillable="true"type="xsd:string"/>
144.<xsd:elementmaxOccurs="1"minOccurs="1"name="country"nillable="true"type="xsd:string"/>
145.<xsd:elementmaxOccurs="1"minOccurs="1"name="string"nillable="true"type="xsd:string"/>
146.</xsd:sequence>
147.</xsd:complexType>
134.<xsd:complexTypename="Station">

SedefinequecomienzaeltipodedatoscomplejoStation.
135.<xsd:sequence>

Indicamosquecomenzamosconladefinicindeltiposecuencia(esdecirquetodosloselementosquesedefinen
dentroestnincluidoseneltipodedatosStation).Existenotrotipoquenoessecuencia(sequence),ysellama
choice(eleccin),enelcualseseleccionaentreunodeloselementosdentrodefinidos(aquelloscomprendidos
entre<xsd:choice>y</xsd:choice>).
136.<xsd:elementmaxOccurs="1"minOccurs="1"name="icao"nillable="true"type="xsd:string"/>
137.<xsd:elementmaxOccurs="1"minOccurs="1"name="w mo"nillable="true"type="xsd:string"/>
138.<xsd:elementmaxOccurs="1"minOccurs="1"name="iata"nillable="true"type="xsd:string"/>

Sedefinen3elementosloscualessondeltipostring,dichoselementosson:icao,wmo,eiata.
139.<xsd:elementmaxOccurs="1"minOccurs="1"name="elevation"type="xsd:double"/>
140.<xsd:elementmaxOccurs="1"minOccurs="1"name="latitude"type="xsd:double"/>
141.<xsd:elementmaxOccurs="1"minOccurs="1"name="longitude"type="xsd:double"/>

Sedefinenotros3elementos,enestecasosondeltipodouble.Estosson:elevation,latitude,ylongitude.
142.<xsd:elementmaxOccurs="1"minOccurs="1"name="name"nillable="true"type="xsd:string"/>
143.<xsd:elementmaxOccurs="1"minOccurs="1"name="region"nillable="true"type="xsd:string"/>
144.<xsd:elementmaxOccurs="1"minOccurs="1"name="country"nillable="true"type="xsd:string"/>
145.<xsd:elementmaxOccurs="1"minOccurs="1"name="string"nillable="true"type="xsd:string"/>

Sedefinenlosltimos4elementosdeltipostring.Loselementosaqudefinidosson:name,region,country,y
string.
146.</xsd:sequence>
147.</xsd:complexType>

Cierredelostagsabiertosanteriormente.
Veamosunejemploderespuesta:
<returnxsi:type="cc1:ArrayOfStation"SOAPENC:arrayType="cc1:Station[86]">
<itemxsi:type="cc1:Station">
<icaoxsi:type="xsd:string">SARS</icao>
<w moxsi:type="xsd:string">87149</w mo>
<iataxsi:nil="true"/>
<elevationxsi:type="xsd:double">91.0</elevation>
<latitudexsi:type="xsd:double">26.817</latitude>
<longitudexsi:type="xsd:double">60.45</longitude>
<namexsi:type="xsd:string">PresidenciaRoqueSaenzPenaAerodrome</name>
<regionxsi:nil="true"/>
<countryxsi:type="xsd:string">
Argentina</country>
<stringxsi:type="xsd:string">SARSPresidenciaRoqueSaenzPenaAerodrome,Argentina
@26.817'S60.45'W91m</string>
</item>
<itemxsi:type="cc1:Station">
</return>

ParaaclarareltipodeestructuradeArrayOfStationusaremosanalogasconotroslenguajesdeprogramacin:
//De lphi//
http://www.desarrolloweb.com/manuales/61/imprimir.php

8/13

15/6/2015

Web Services con PHP - Manual completo

Station=record
icao:String
w mo:String
iata:String
elevation:String
latitude:String
longitude:String
name:String
region:String
country:String
string_:String
end
ArrayOfSation:arrayofStation
//C#//
structStation
{
Stringicao
Stringw mo
Stringiata
Stringelevation
Stringlatitude
Stringlongitude
Stringname
Stringregion
Stringcountry
Stringstring_
}
Station[]ArrayOfStation

ComovemosnoesfcilseguirtodoloqueestadefinidodentrodeundocumentoWSDL,porsuertemuchasveces
nonostenemosquepreocuparportodoestoyaquelosmismossitiosdondeseencuentranalojadoslosWeb
ServicesnosproveendelainformacinnecesariasinnecesidaddetenerquerecurriraverlosarchivosWSDL.
TambinexistenaplicacionescomosonAltovaXMLSPYquenosproveendelainformacindemaneragrfica

UtilizandoNuSOAPIII
Comenzamosaprogramar!
ComomencioneanteriormentehedivididolaaplicacindepruebadelWebServiceendos(2)archivos,unoque
mostraratodaslaslocalidadesdondeexistenpronsticos(seleccionarLocalidad.php)yotroquemostrarael
pronsticoparalalocalidadseleccionada(mostrarPronostico.php)
Veamoscomoconsumimosunwebservice(searchByCountry):
Enelcdigosehaneliminadolascomprobacionesdeerroresparapoderfacilitarlalecturadelospasos.Veamos
cualessonlospasosparaconsumirunserviciowebdesdePHP:
require_once(
lib/nusoap.php
)

DebemosincluirlalibreraNuSOAP.Enesteejemploasumimosqueeldirectoriodondeseencuentraelarchivo
nusoap.phpestaubicadoenelsubdirectoriolib(apartirdedondeestanuestroscript).
$oSoapClient=new soapclient('http://live.capescience.com/w sdl/GlobalWeather.w sdl',true)

Debemosinstanciarlaclasesoapclient,yaqueenestaocasinutilizaremossoloelclientequenosprovee
NuSOAP.LosparmetrosenviadossonlaubicacindeldocumentoWSDLytruecomosegundoparametro(este
ltimoparmetroindicaqueelprimerdocumentoesunWSDL).
Definimosunarrayconelpasparaelcualsequierenobtenerlaslocalidadesquetienenpronsticosdisponibles.
VolviendoaldocumentoWSDLpodemosverquelavariablequedebemosenviares
country
yqueesdeltipostring
$aParametros=array("country"=>"argentina")
280.<messagename="searchByCountry">
http://www.desarrolloweb.com/manuales/61/imprimir.php

9/13

15/6/2015

Web Services con PHP - Manual completo

281.<partname="country"type="xsd:string"/>
282.</message>
$aRespuesta=$oSoapClient>call("searchByCountry",$aParametros)

Llamamosalmtodocalldelobjetosoapclient.Almismolepasamoscomoparmetroelnombredelmtodoque
queremosejecutarenelwebservice(searchByCountry)ylosparmetros($aParametros).Ennuestravariable
$aRespuestatenemosunarrayconlarespuestadelWebService.Estearraytieneelformatodescriptoen
ArrayOfStation

(elcualfuevistoanteriormente).Esdecirpodemosaccederalasvariablesdescriptasen
ArrayOfStationdelasiguientemanera:$aRespuesta[
wmo
],$aRespuesta[
elevation
],$aRespuesta[
name
],etc.
Ahoraqueyaconocemosc&oactemoseraelprocedimientoparaconsumirunWebService,veamosunpocoms
enprofundidadlosmtodosdesoapclientqueutilizamos:
Alcrearunainstanciadesoapclient,existenvariosparmetrosquepodemosenviarparasucreacin:
$oSoapClient=new soapclient(
<urldondeseencuentraelw ebserviceoWSDL>,
[<booleanaindicandosielprimerparmetroesunWSDL>],
[<enteroconelPortame>],
[<cadenaproxyHost>],
[<cadenaproxyPort>],
[<cadenanombredeusuario>],
[<cadenapassw ord>],
[<enteroconeltimeoutdelaconexin>],
[<enteroconeltimeoutdelarespuesta>])

Soloelprimerparmetroesnecesario(laubicacindelWebServiceodeldocumentoWSDLdelWebService),
todoslosdemssonopcionales.
AlejecutarelWebService,existenvariosparmetrosquepodemosenviaralmtodo:
call(<mtodoquequeremosejecutarenelservidor>,
[<unarrayasociativoconlosparmetrosquedebemosenviar(siexisten)>],
[<cadenaconelespaciodenombres(namespace)>],
[<cadenaconelvalordelaaccinSOAP>],
[<booleanaindicandosiestapresentelosvaloresdeSOAPVALenlosheaders>],
[<booleanalacualyanoseutiliza>],
[<cadenaconelstyleausarcuandoserealizalaserializacindelosparametros>],
[<cadenaquepuedeser"encoded"o"literal"utilizadaparaserializacindelosparametros>])

Cmovemosexistenmuchosmsparametrosdelosquehabiamosutilizado,perocomoexigenunconocimiento
msprofundosobrelosWebServicesloscualesescapanalosalcancesdeesteartculonolostrateremosaqu.

UtilizandoNuSOAPIV
Cmolopodemosusar?:
ExistenmuchasformasenquepodramosusaresteWebService,podemosdejarqueelvisitanteseleccionesu
pasylocalidad,yquenuestrositioleretornecualeselpronosticoactual(solodeberamosincorporarunpaso
anterioralqueseofreceenelcdigo,eldeseleccindelpas).
Otrousoquepodemosdarleeseldemostrarcualeselclimaactualparaunalocalidaddeterminada(lomismoque
hacenmuchosdiariosensuscabeceras).Sidecidimosimplementarlasegundaopcindebemostenerespecial
cuidadoencomolohacemos,yaquesiporcadapeticinquehagaelusuariodebemosconectarnosconelservidor
queofreceelwebservice,estoprovocaraunagrandemoraparaelusuario,yunasobrecargainnecesariadel
servidor.Parasolucionarestopodemosguardarenunarchivodetextooenunabasededatos,elclimaactual,para
leerlodesdeall.Estearchivo,obasededatos,laactualizaramoscadauntiempoprudencial(comopuedeseruna
horaoms).
http://www.desarrolloweb.com/manuales/61/imprimir.php

10/13

15/6/2015

Web Services con PHP - Manual completo

OtrosWebServices:
ActualmenteexistengrancantidaddeWebServices,gratuitosyno.EnelsitiodeXMethodspuedenencontrargran
cantidaddeellos.SinirmslejosGoogleofreceunwebservicepararealizarbsquedas(solohayqueregistrarse
enhttp://www.google.com/apis/)ynospermitirrealizar1000consultasporda(creoquepuedesermsque
interesanteparamuchos).
Conclusin:
LosWebServicessonuntemaapasionante,yaquebrindangranfuncionalidadyposibilidadderealizarcambiosy
mejorarnuestrasaplicaciones.Unmismowebservicepuedeserconsumidotantoporaplicacionesqueseejecutan
enunservidoryentregancdigohtmlalcliente,comoporaplicacionesquecorrendirectamenteenlamquinadel
cliente.Comovemoslasposibilidadessoninfinitas,esslocuestindecomenzaraexperimentar.
Apndice:
CdigodeseleccionarLocalidad.php
/**
*Codigoparaconsumirunserviciow eb(WebService)pormediodeNuSoap.
*Ladistribuciondelcodigoestotalmentegratuitaynotieneninguntipoderestriccion.
*Seagradecequemantenganlafuentedelmismo.
*/$sPais="argentina"//Nombredelpaisquequeremosellistadodelocalidades
//Inclusiondelalibrerianusoap(laquecontendratodalaconexinconelservidor//require_once('lib/nusoap.php')
$oSoapClient=new soapclient('http://live.capescience.com/w sdl/GlobalWeather.w sdl',true)
if($sError=$oSoapClient>getError()){
echo"Nosepudorealizarlaoperacin[".$sError."]"
die()
}
$aParametros=array("country"=>$sPais)
$respuesta=$oSoapClient>call("searchByCountry",$aParametros)
//Existealgunafallaenelservicio?if($oSoapClient>fault){//Si
echo'Nosepudocompletarlaoperacin'
die()
}else{//No
$sError=$oSoapClient>getError()
//Hayalgunerror?
if($sError){//Si
echo'Error:'.$sError
die()
}
}
?>
<html>
<body>
<formaction="mostrarPronostico.php"method="post"name="frmLocalidades"id="frmLocalidades">
<tablew idth="400"border="0"cellspacing="0"cellpadding="0">
<tr>
<tdcolspan="2"><divalign="center">Seleccioneunalocalidad</div></td>
</tr>
<tr>
<tdw idth="61"></td>
<tdw idth="339"></td>
</tr>
<tr>
<td>Localidad:</td>
<td><selectname="codLocalidad"id="codLocalidad">
$aElemento)
echo"<optionvalue='".$aElemento["w mo"]."'>".$aElemento["name"]."</option>"
?>
</select></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
http://www.desarrolloweb.com/manuales/61/imprimir.php

11/13

15/6/2015

Web Services con PHP - Manual completo

<tr>
/td>
td><inputtype="submit"name="Submit"value="Quieroverelpronostico"></td>
/tr>
/table>
/form>
/body>
</html>

UtilizandoNuSOAPV
CdigodemostrarPronostico.php
<?php
/**
*Codigoparaconsumirunserviciow eb(WebService)pormediodeNuSoap
*Ladistribuciondelcodigoestotalmentegratuitaynotieneninguntipoderestriccion.
*Seagradecequemantenganlafuentedelmismo.
*/
//LeindicamosaPHPquenomuestrelosNotices(porsielservicionoretornadatos)
//(estosepuedeevitarpreguntandosihaydatosantesdemostrarlos)
error_reporting(1)
//Inclusiondelalibrerianusoap(laquecontendratodalaconexinconelservidor
//require_once('lib/nusoap.php')
$oSoapClient=new soapclient('http://live.capescience.com/w sdl/GlobalWeather.w sdl',true)
if($sError=$oSoapClient>getError()){
echo"Nosepudorealizarlaoperacin[".$sError."]"
die()
}
//VienedeunPOST=>Seleccionounaciudad
if($_SERVER["REQUEST_METHOD"]=="POST"){
$aParametros=array("code"=>$_POST["codLocalidad"])
$aRespuesta=$oSoapClient>call("getWeatherReport",$aParametros)
}
//Existealgunafallaenelservicio?
if($oSoapClient>fault){//Si
echo'Nosepudocompletarlaoperacin'
die()
}else{//No
$sError=$oSoapClient>getError()
//Hayalgunerror?
if($sError){//Si
echo'Error:'.$sError
}
}
?
><html>
<body>
<tablew idth="367"border="0"cellspacing="0"cellpadding="0">
<tr>
<tdcolspan="2"><divalign="center">Datosdeltiempo</div></td>
</tr>
<tr>
<tdw idth="147"></td>
<tdw idth="220"></td>
</tr>
<tr>
<td>Nombre:</td>
<td><?=$aRespuesta["station"]["name"]?></td>
</tr>
<tr>
<td>Elevacin:</td>
<td><?=$aRespuesta["station"]["elevation"]?></td>
</tr>
<tr>
<td>FechayHora:</td>
<td><?=$aRespuesta["timestamp"]?></td>
</tr>
<tr>
<td>Pas:</td>
http://www.desarrolloweb.com/manuales/61/imprimir.php

12/13

15/6/2015

Web Services con PHP - Manual completo

<td><?=$aRespuesta["station"]["country"]?></td>
</tr>
<tr>
<td>Latitud:</td>
<td><?=$aRespuesta["station"]["latitude"]?></td>
</tr>
<tr>
<td>Longitud:</td>
<td><?=$aRespuesta["station"]["longitude"]?></td>
</tr>
<tr>
<td>Presin:</td>
<td><?=$aRespuesta["pressure"]["string"]?></td>
</tr>
<tr>
<td>Temperatura:</td>
<td><?=$aRespuesta["temperature"]["string"]?></td>
</tr>
<tr>
<td>Visibilidad:</td>
<td><?=$aRespuesta["visibility"]["distance"]?>mts.</td>
</tr>
</table>
</body>
</html>

Autoresdelmanual:
Hayqueagradeceradiversaspersonasladedicacinprestadaparalacreacindeestemanual.Susnombresjunto
conelnmerodeartculosredactadosporcadaunosonlossiguientes:
OrlandoFabinBrea
http://w w w .smartsol.com.ar
(9captulos)

Todoslosderechosdereproduccinydifusin reservadosaGuiarteMultimediaS.L.
Volver

http://www.desarrolloweb.com/manuales/61/imprimir.php

13/13

You might also like