Home :: Web :: php :: Creando un Web Service con PHP
 
Creando-un-Web-Service-con-PHP

Creando un Web Service con PHP

mar 05, 2010 en php por

Un web service o servicio web es un estándar de comunicación por medio de documentos XML que permite comunicar aplicaciones que no necesariamente estén en el mismo lenguaje, sistema operativo o inclusive ubicación geográfica. Si quieres hacer un servicio web para que muchas aplicaciones puedan consultar tu información entonces un buen punto de partida es este artículo.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

Muchas veces es necesario que tus aplicaciones, a parte de ofrecer una interfaz gráfica para que los usuarios manipulen la información del sistema, puedan ofrecer un servicio web que les permita manipular la información sin necesidad de ver la interfaz gráfica. Esto es muy útil para crear aplicaciones automáticas que no les interesa una interfaz gráfica sino simplemente manipular datos. Además es útil para publicar servicios por internet, como por ejemplo convertir unidades, convertir pdf a doc, consultar gmail, etc.

¿Qué es un Web Service?

Un web service o servicio web, es simplemente un estándar para intercambiar datos entre aplicaciones. Al ser un estándar, no importa el lenguaje en el que se implemente ni en que sistema operativo se ejecute ya que si respeta el estándar es como si las aplicaciones hablaran el mismo idioma.

Un servicio web se parece en muchos aspectos a una página web tradicional y aquí menciono sus similitudes:

  • Ambas trabajan en el modelo cliente-servidor dónde el cliente es el usuario que consume (página web o servicio web) y el servidor es quien provee (ofrece el contenido).
  • Ambas por lo general corren sobre el puerto 80.
  • Ambas utilizan el protocolo de comunicación HTTP.
  • Ambos servidores reciben una petición y de acuerdo a eso producen un resultado.
  • Ambos clientes envían peticiones a los servidores.

La principal diferencia entre una página web y un servicio web es que la primera recibe peticiones que no siguen un patrón establecido mientras que un servicio web recibe una petición en XML bajo un estándar establecido por el W3C (World Wide Web Consortium).

Existen dos principales tipos de web service, SOAP y XML-RPC. En este artículo voy a explicar ambos y a continuación voy a explicar algunas de sus diferencias.

SOAP XML-RPC
Es un estándar complejo Es un estándar simple.
No tiene restricción de tipos de datos Solo maneja hasta 8 tipos de datos.
Se basa en un documento WSDL que define la información del servicio web. (El WSDL no es necesario pero casi siempre se define) No tiene un documento que describa el servicio web. Las implementaciones se tienen que hacer con previo conocimiento de los métodos con los que cuenta el servicio web.
Es complicado de implementar. Es más fácil de implementar.

Un Web Service sigue un estándar en el que se envía bastante información adicional a la data real. Por ejemplo para mandar un número a mi servicio web no basta con mandarle el número en sí, sino que tengo que mandarle el tipo de dato, que método lo debe procesar, etc. Dicho esto te recomiendo que si quieres realizar un programa que se ejecute en tiempo real y que tenga como principal objetivo mejorar la velocidad de ejecución entonces no debes utilizar un servicio web.

¿Cómo implementar un Web Service?

Es posible realizar una implementación desde cero en PHP de un Web Service. Sin embargo, es muy poco práctico ya que necesito tener un amplio conocimiento del estándar y además requiere mucho tiempo de implementación.

Es por esta razón que la mejor forma de implementar un servicio web es utilizando una librería ya creada. Existe una gran variedad de librerías gratuitas en el mercado tanto como para SOAP como XML-RPC pero de todas yo he escogido utilizar las clases del Zend Framework.

¿Por qué Zend Framework?

He escogido utilizar las clases del Zend Framework por las siguientes razones:

  • Son Orientadas a Objetos (POO).
  • Ofrece clases para SOAP y XML-RPC. Esto es bastante conveniente ya que puedo manipular sin problemas ambos tipos de servicio web en lugar de tener que conseguir una para SOAP y otra para XML-RPC.
  • No requiere realizar modificaciones en la instalación de mi servidor web ni mi PHP. Muchas de las otras librerías que existen necesitan que PHP tenga incluida ciertas librerías que no necesariamente estarán presentes en un ambiente de producción, especialmente si se cuenta con un hosting compartido.
  • Si realizas aplicaciones de gran escala, el Zend Framework es muy útil porque ofrece una gran librería de clases con las que puedes trabajar y realizar tareas en cuestión de segundos. Si no conoces el Zend Framework te recomiendo que le des una mirada, te va a encantar.
  • En el caso de SOAP te permite generar automáticamente el archivo WSDL o sino te ofrece una clase para poder crearlo manualmente.

Preparando el ambiente de desarrollo para utilizar Zend Framework

Antes de mostrarte como crear y utilizar un web service, es necesario que prepares tu ambiente de desarrollo PHP para que utilice Zend Framework. Para ello asumo que ya cuentas con un servidor web con PHP instalado, si no lo tienes te recomiendo leer primero Instalando PHP y MySQL en Windows y/o Linux. Además asumo que sabes cuál es la raíz de tu servidor web por lo que trabajaremos directamente sobre esta ruta.

Descargar Zend Framework

Lo primero que tienes que hacer es descargar Zend Framework de la siguiente ruta http://framework.zend.com/download/latest. Te recomiendo descargar la versión Minimal ya que no necesitamos nada más para este caso. La versión que se utilizará en este artículo es Zend Framework 1.10.2 por ser la más reciente hasta el momento.

Copiar el Zend Framework al servidor web.

Una vez descargado debes descomprimir el Zend Framework. Una vez descomprimido encontrarás una carpeta library que tiene dentro de ella la carpeta Zend. La carpeta Zend es la que contiene a todo el Zend Framework y es la que debes copiar a tu servidor web.

No es necesario copiar todo el Zend Framework a tu servidor web, solo necesitas algunas clases para implementar servicios web así que dejo a tu criterio si copias todo o solo copias las carpetas necesarias. Más adelante cuando muestre la implementación voy a especificar que carpetas y archivos del framework son necesarios.

Es importante que la carpeta Zend exista en tu servidor web y no solo las carpetas internas del Framework ya que este es un requisito para que esto funcione.

Creando la estructura de archivos

En este artículo voy a enseñarte como crear web services con SOAP y XML-RPC. En ambos te voy a enseñar a crear el cliente (consumidor) y el servidor (proveedor). Es por esta razón que voy a necesitar que crees la siguiente estructura de archivos y carpetas en la raíz de tu servidor web (puede ser una carpeta dentro del servidor web).

  • raíz
    • Zend
    • soap
      • cliente.php
      • servidor.php
    • xmlrpc
      • cliente.php
      • servidor.php
    • miWebService.php

La carpeta Zend contendrá al Framework. La carpeta soap es para el ejemplo de implementación de web service usando SOAP y la carpeta xmlrpc para la implementación de web service usando XML-RPC. En ambas carpetas hay 2 archivos. El archivo cliente.php contendrá al código para consultar el servicio web y el archivo servidor.php contendrá el código que procesa las peticiones de nuestro servicio web.

El archivo miWebService.php contendrá la implementación del servicio web en si para lo cual no importa si lo ofreceremos con SOAP o XML-RPC.

miWebService.php

El archivo miWebService.php contendrá una clase con los métodos que queremos que tenga nuestro servicio web. En este ejemplo voy a crear tres métodos:

Método Descripción
Saludame Recibirá un nombre y un idioma y devolverá una cadena de texto saludando a la persona en el idioma adecuado.
Sumar Recibirá un arreglo de números a sumar y devolverá la suma de todos los números enviados.
InfoRectangulo Recibirá un parámetro que represente una clase Rectangulo (que tenga ancho y altura) y devolverá una clase Informacion (que tenga area, volumen, hypotenusa y si es un cuadrado).
Este método solo lo utilizaremos en SOAP ya que en XML-RPC no podemos mandar clases (solo tiene 8 tipos de datos).

En el código de miWebService.php voy a colocar las dos clases que voy a utilizar para el método InfoRectangulo. El código de miWebService.php es el siguiente:

<?php
//-----------------------------------------------
class Rectangulo
{
	/** @var int */
	public $ancho;

	/** @var int */
	public $altura;
}
//-----------------------------------------------
class Informacion
{
	/** @var int */
	public $area;

	/** @var int */
	public $perimetro;

	/** @var float */
	public $hypotenusa;

	/** @var bool */
	public $esCuadrado;
}
//-----------------------------------------------
class miWebService
{
	/**
	 * Saluda a una persona en un idioma
	 * especifico
	 *
	 * @param string $nombre
	 * @param string $idioma
	 * @return string
	*/
	function Saludame($nombre, $idioma)
	{
		if (strcmp($idioma, "es") == 0)
			return "Hola " . $nombre;
		else if (strcmp($idioma, "en") == 0)
			return "Hello " . $nombre;
		else if (strcmp($idioma, "fr") == 0)
			return "Bonjour " . $nombre;
		else
			return "??? " . $nombre;
	}

	/**
	 * Devuelve la suma de todos los
	 * numeros enviados
	 *
	 * @param array $numeros
	 * @return float
	 */
	function Sumar($numeros)
	{
		if (!is_array($numeros))
			return 0;
		$suma = 0;
		foreach($numeros as $num)
		{
			$suma += floatval($num);
		}
		return $suma;
	}

	/**
	 * Devuelve la informacion de un rectangulo
	 *
	 * @param Rectangulo $rect
	 * @return Informacion
	 */
	function InfoRectangulo($rect)
	{
		$info = new Informacion();
		$info->area = $rect->ancho * $rect->altura;
		$info->perimetro = $rect->ancho * 2 + $rect->altura * 2;
		$info->hypotenusa = sqrt($rect->ancho * $rect->ancho + $rect->altura * $rect->altura);
		$info->esCuadrado = ($rect->ancho == $rect->altura);
		return $info;
	}
}

Algo que tienes que tener muy en cuenta son los comentarios de esta clase. Estos comentarios definen la descripción de cada una de las funciones así como el tipo de dato de los parámetros (@param) y del valor de retorno (@return) así como de los atributos (@var) de mis clases Rectangulo e Informacion.

Sin estos comentarios el servicio web se creará con tipos de datos inciertos. Algunos tipos de datos que puedes usar son: int, string, float, bool, array. Pero como puedes ver en el ejemplo también puedes especificar nombres de clases.

En el caso de las clases, si no se puede determinar el tipo de dato de algún atributo de una clase el documento WSDL se creará como si el atributo no existiese.

Hasta ahora, lo único que hemos creado es una clase con métodos. Lo que haremos ahora es poner un web service al frente para que interactúe con esta clase.

Implementando el web service con SOAP

La gran mayoría de servicios web de tipo SOAP necesitan un documento WSDL. El documento WSDL es simplemente un documento en XML que contiene la información completa de nuestro servicio web como por ejemplo los métodos que implementa, los parámetros que recibe y devuelve e inclusive la descripción de nuevos tipos de datos.

El documento WSDL se puede generar manualmente o utilizando la clase Zend_Soap_Wsdl que viene con el framework. Estos dos métodos son bastantes tediosos y requieren un amplio conocimiento del estándar SOAP.

La mejor forma de crear el documento WSDL es utilizando la clase Zend_Soap_AutoDiscover que permite generarlo de forma automática.

Para esta implementación solo necesitas las siguientes carpetas y archivos del framework:

WSDL manual WSDL automático (recomendada)
  • Zend
    • Soap
    • Server
  • Zend
    • Server
    • Soap
    • Uri
    • Validate
      • Hostname
      • Abstract.php
      • Hostname.php
      • Interface.php
      • Ip.php
    • Loader.php
    • Registry.php
    • Uri.php

soap / servidor.php

El código del servidor es bastante simple. Agregamos nuestra raiz al path del sistema para que los require_once busquen a partir de la raíz y así encuentren el framework de Zend sin necesidad de colocar una ruta completa o relativa.

Luego incluimos nuestro archivo miWebService.php y verificamos si se ha solicitado el documento WSDL o es una petición normal. Si se está solicitando el documento WSDL usamos la clase AutoDiscover para generar el documento de forma automática en base a mi clase miWebService, de lo contrario atendemos la petición utilizando la clase miWebService.

Aquí va el código:

<?php
// Agregamos la raíz al path para los require_once
set_include_path(get_include_path() .
                 PATH_SEPARATOR .
                 realpath(dirname(__FILE__) . "/../"));

// Incluimos nuestra clase que tiene el servicio web
require_once('miWebService.php');

if ($_SERVER['QUERY_STRING'] == 'wsdl')
{
	// Utilizamos la clase Zend_Soap_AutoDiscover para
	// generar de forma automática el WSDL
	require_once('Zend/Soap/AutoDiscover.php');
	$wsdl = new Zend_Soap_AutoDiscover();
	$wsdl->setClass('miWebService');
	$wsdl->handle();
}
else
{
	// Calculamos la ruta del WSDL del servidor
	$wsdl_url = sprintf('http://%s%s?wsdl', $_SERVER['HTTP_HOST'], $_SERVER['SCRIPT_NAME']);    

	// Creamos un servidor que atienda en base al WSDL generado
	require_once('Zend/Soap/Server.php');
	$server = new SoapServer($wsdl_url);
	$server->setClass('miWebService');
	$server->handle();
}

La ruta de tu documento WSDL es http://localhost/soap/servidor.php?wsdl 

soap / cliente.php

En el cliente vamos a consultar a nuestros tres métodos declarados. El código es bastante simple así que aquí va:

<?php
// Agregamos la raíz al path para que podamos
// incluir Zend de forma directa
set_include_path(get_include_path() .
                 PATH_SEPARATOR .
                 realpath(dirname(__FILE__) . "/../"));

//---------------------------------------------------------------
// Creamos un cliente soap
//---------------------------------------------------------------
require_once("Zend/Soap/Client.php");
$wsdl_url = "http://localhost/soap/servidor.php?wsdl";
$cliente = new Zend_Soap_Client($wsdl_url);

//---------------------------------------------------------------
// Saludamos en varios idiomas
//---------------------------------------------------------------
echo "<h1>Metodo Saludame</h1>";
foreach (array("es", "en", "fr", "gr") as $idioma)
{
	echo "<strong>$idioma: </strong>";
	echo $cliente->Saludame("Copstone", $idioma);
	echo "<br/>";
}

//---------------------------------------------------------------
// Sumamos una serie de numeros aleatorios
//---------------------------------------------------------------
echo "<h1>Metodo Sumar</h1>";
$numeros = array();
for ($i=0; $i<5; $i++)
{
	$numeros[$i] = rand()%100;
	printf("%4d<br/>", $numeros[$i]);
}
$suma = $cliente->Sumar($numeros);
echo "<strong>SUMA: </strong>" . $suma;

//---------------------------------------------------------------
// Calulamos la informacion de un rectangulo
//---------------------------------------------------------------
echo "<h1>Metodo InfoRectangulo</h1>";
// Incluyo miWebService.php para usar Rectangulo e Informacion
require_once("miWebService.php");
$rect = new Rectangulo();
$rect->ancho = 20;
$rect->altura = 30;
$info = $cliente->InfoRectangulo($rect);

echo "Rectangulo de {$rect->ancho}x{$rect->altura}<br/>";
echo "Area: {$info->area}<br/>";
echo "Perimetro: {$info->perimetro}<br/>";
echo "Hypotenusa: {$info->hypotenusa}<br/>";
if ($info->esCuadrado)
	echo "Es Cuadrado<br/>";
else
	echo "Es Rectangular<br/>";

 

Implementando el web service con XML-RPC

Con XML-RPC no necesitamos definir es bastante más directo.

Para esta implementación solo necesitas las siguientes carpetas y archivos del framework:

XML-RPC normal
  • Zend
    • Http
    • Loader
    • Server
    • Uri
    • Validate
      • Hostname
      • Abstract.php
      • Hostname.php
      • Interface.php
      • Ip.php
    • XmlRpc
    • Loader.php
    • Registry.php
    • Uri.php

xmlrpc / servidor.php

El código es bastante parecido a SOAP pero no necesita WSDL:

<?php
// Agregamos la raíz al path para que podamos
// incluir Zend de forma directa
set_include_path(get_include_path() .
                 PATH_SEPARATOR .
                 realpath(dirname(__FILE__) . "/../"));

// Incluimos nuestra clase que tiene el servicio web
require_once('miWebService.php');
require_once('Zend/XmlRpc/Server.php');

$server = new Zend_XmlRpc_Server();
$server->setClass('miWebService');
echo $server->handle();

xmlrpc / cliente.php

En el cliente solo vamos a consultar los primeros dos métodos debido a que el tercero necesita recibir un tipo de dato Rectangulo que no es soportado por XML-RPC por ser nuestro propio tipo de dato.

<?php
// Agregamos la raíz al path para que podamos
// incluir Zend de forma directa
set_include_path(get_include_path() .
                 PATH_SEPARATOR .
                 realpath(dirname(__FILE__) . "/../"));

//---------------------------------------------------------------
// Creamos un cliente xml-rpc
//---------------------------------------------------------------
require_once("Zend/XmlRpc/Client.php");
$xmlrpc_url = "http://localhost/xmlrpc/servidor.php";
$cliente = new Zend_XmlRpc_Client($xmlrpc_url);

//---------------------------------------------------------------
// Saludamos en varios idiomas
//---------------------------------------------------------------
echo "<h1>Metodo Saludame</h1>";
foreach (array("es", "en", "fr", "gr") as $idioma)
{
	echo "<strong>$idioma: </strong>";
	echo $cliente->call("Saludame", array("Copstone", $idioma));
	echo "<br/>";
}

//---------------------------------------------------------------
// Sumamos una serie de numeros aleatorios
//---------------------------------------------------------------
echo "<h1>Metodo Sumar</h1>";
$numeros = array();
for ($i=0; $i<5; $i++)
{
	$numeros[$i] = rand()%100;
	printf("%4d<br/>", $numeros[$i]);
}
$suma = $cliente->call("Sumar", array($numeros));
echo "<strong>SUMA: </strong>" . $suma;

Conclusión

Gracias a las clases del Zend Framework, no me tengo que preocupar del estándar ni como funciona y puedo generar servicios web en cuestión de minutos.

Al separar mi servicio web en un archivo adicional (miWebService.php) puedo reutilizar la clase para servir por SOAP o XML-RPC sin problemas.

Para agregar más métodos a mi servicio web, simplemente tengo que agregar funciones a mi clase miWebService.

Mi servicios web de SOAP y XML-RPC pueden ser consultados desde cualquier aplicación ya que respetan todos los estándares.


Autor:


Comentarios (36)

Andrés Chávez dice:

Están demasiado buenos los post. En verdad que esta clase de información motiva a seguir en el mundo de la programación :D !!!

carlos dice:

Hola Alfredo, yo estoy recién conociendo los web service y necesito consumir un ws hecho en aspx. El tema es que me entregaron un link en aspx que al abrirlo se ve un xml el cual necesito leer con php. ojalá pudieras tener un ejemplo o me puedas orientar ya que no he logrado resolver mi problema, Gracias.

Carlos,

Si es un web service en ASPX probablemente deberías tener una ruta para el WSDL. Si es así, entonces la consulta con SOAP es muy parecida a la que se muestra en este artículo. Te voy a mostrar el código para consultar un web service básico de ASPX que lo único que tiene es un método HelloWorld.

require_once("Zend/Soap/Client.php");
$wsdl_url = "http://localhost/aspx/Service.asmx?WSDL";
$cliente = new Zend_Soap_Client($wsdl_url);

// Realizamos la consulta
$result = $cliente->HelloWorld();

// Imprimimos el objeto con el resultado
// para ver que cosa retorno la consulta
echo "<pre>";
print_r($result);
echo "</pre>";

// Imprimimos el valor del resultado
echo $result->HelloWorldResult;
carlos dice:

Alfredo,
Tengo un par de dudas:
1- Como puedo saber cuales son los metodos que tiene el ws??
2- La ruta del ws es de la siguiente manera: https://sistemas.xxx.cl/ws.aspx?fecha=2010-03-16
3- Cuando abro la pagina obtengo lo siguiente:

<?xml version="1.0" encoding="utf-8"?>
<documentos>
	<documento id="123">
		<cliente>
			<nombre>Cliente 1</nombre>
			<domicilio>xx</domicilio>
		</cliente>
		<cabecera>
			<tipo>a</tipo>
			<numero>111</numero>
			<fecha>2009-11-22</fecha>
		</cabecera>
	</documento>
	<documento id="124">
		<cliente>
			<nombre>Cliente 4</nombre>
			<domicilio>yy</domicilio>
		</cliente>
		<cabecera>
			<tipo>b</tipo>
			<numero>119</numero>
			<fecha>2009-11-22</fecha>
		</cabecera>
	</documento>
</documentos>

Debo tener alguna consideración especial para abrir este link (https)?

Espero que me puedas ayudar.

Carlos,

Con solo ver la ruta puedo darme cuenta de que no es un web service, es decir, no utiliza ningún estándar. En realidad esta página recibe cualquier parámetro y lo único que hace es armar un XML correspondiente. El concepto es el mismo que el de un web service con la única diferencia es que al no utilizar un estándar practicamente tienes que adivinar sus métodos y los valores de retorno.

Esto va un poco fuera del tema de web service pero en pocas palabras lo que tienes que hacer es cargar el XML generado por esa página y procesar el documento, aquí te dejo un ejemplo:

// Cargar el archivo XML
$xml = simplexml_load_file("https://sistemas.xxx.cl/ws.aspx?fecha=2010-03-16&quot ;) ;

// Listar todos los nombres de los clientes
foreach ($xml->documento as $doc)
{
    echo $doc->cliente->nombre;
}

// Para ver todo el documento xml
echo "<pre>";
print_r($xml);
echo "</pre>";

En cuanto a lo de https, no deberías tener ningún problema si es que el servidor tiene un certificado válido.

carlos dice:

Alfredo,
funcionó perfectamente, gracias por tu ayuda.

Juanguss dice:

Hola Alfredo:

Muchas gracias por el tutorial. Llevos un tiempo “pegandome” con WSO2 y NUSOAP sin los resultados adecuados, y con tu tutorial se me ha abierto otra linea posible.

Estoy desarrollando un web service un poco complejo ya que los datos que recibo son tipos complex con atributos, y no consigo que termine de funcionar.

He probado lo que indicas en el tutorial y tanto al generar el WSDL como al llamar directamente al servicio me devuelve respectivamente un

Parse error: parse error, unexpected T_STRING, expecting ‘{‘ in /var/www/vhost/cucuc.es/home/html/produccion/ws/Zend/Soap/AutoDiscover.php on line 51

y

Parse error: parse error, unexpected T_STRING, expecting ‘{‘ in /var/www/vhost/cucuc.es/home/html/produccion/ws/Zend/Soap/Server.php on line 38

¿Crees que puede deberse a un problema del ZEN o la construcción del fichero PHP que contiene mi clase?. He seguido la estructura del ejemplo para generarla.

No suelo pedir ayuda si no estoy en fase de desesperación como es el caso.

He probado a realizar el ejemplo que pones y tambien me da error:

Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in /var/www/vhost/cucuc.es/home/html/produccion/ws/webservice.php on line 9

Gracias de antemano por tu ayuda.

Juanguss dice:

Ampliación al misterio: Lo traslado todo a un servidor en local con PHP5 y funciona, lo llevo al servidor de producción con PHP 4.6.3 y no. ¿Pueden ir por ahi las vueltas?

Juan,

Me faltó poner en el post que es necesario contar con PHP 5.0 o superior. Esto se debe a que Zend trabaja con clases y antes de la versión PHP 5.0 no existían las clases en PHP (o por lo menos no estaban completas). Probablemente, tu servidor tenga una opción para activar PHP 5.0 así que actívalo y debería funcionar todo sin ningún problema.

Abel Marmolejo dice:

Muy buen post, muchas gracias por tu invaluable aportación. Aportará demasiadas soluciones a mi proyecto de titulación del máster y obviamente para mi trabajo.

wilfo dice:

Muy buen tutorial Alfredo Granda ..Buen trabajo hombre.

Tengo una pregunta para ud.:
¿Sera posible consultar de la base datos a tarves de una función en el webservice y devlver todo eso por el servicio web que zend ofrece?
Porque preguntas eso Wilfredo?..Bueno yo he intyentado enviar 50 ergistros y me aparece un error y
creo que debe tener un limite pero creo que debe ser otra cosa..De lo que si estoy seguro es que por servicio soap se puede pasar lo que se desee…
Tiene ud. algun ejemplo con zend que jale datos de mysql y se pueda consumir desde un cliente..?

Me pregunto si es compatible con .net…Ya que me interesa combinar esta tecnologia con .net ?

Si es posible, y no es necesario que ponga un ejemplo ya que la lógica es la misma, lo único que tienes que hacer es obtener los datos desde una base de datos en lugar de obtenerlos desde un arreglo. En cuanto al límite no existe alguno que yo sepa, el error probablemente es que el contenido que estás intentando devolver tiene caracteres inválidos que están malogrando el XML de respuesta.

wilfo dice:

Señor Alfredo y me gustaria su opinión sobre el uso de webservice con zend framework , su uso para una pequeña instituciòn que desea ampliar sus horizontes compartiendo información.
Ud. cree que e eficiente el uso de servicios soap?Desde su punto de vista.
Recurro a ud. por la experiencia que posee y su opinión va ser muy importante para mi.

Depende mucho de lo que se necesite hacer y con que herramientas se cuente. En lo personal considero que el SOAP es bastante sencillo de implementar pero no es lo más eficiente ya que el XML es bastante extenso aunque la respuesta sea un solo número. La verdad es que no puedo dar una respuesta concreta sin tener un mayor conocimiento de la situación.

Mauro dice:

Excelente Artículo!
Muchas Gracias y Felicitaciones Alfredo.

Salu2!

Ukesnike dice:

Hola Alfredo

de primeras muchas gracias por tu tiempo, da gusto cuando las cosas están bien explicadas.

os quería preguntar, soy novato en esto de PHP y quería hacer un pequeño web services para luego usarlo desde una aplicación windows., he estado siguiendo el ejemplo paso por paso pero me da un fallo al ejecutar el server.

Fatal error: Uncaught exception ‘Zend_Soap_Server_Exception’ with message ‘SOAP extension is not loaded.’ in /Soap/Server.php:164 Stack trace: #0 /soap/servidor.php(56): Zend_Soap_Server->__construct(NULL, NULL) #1 {main} thrown in /Zend/Soap/Server.php on line 164

llevo unos días volviéndome loco y no consigo saber cual es el fallo. agradezco cualquier ayuda

Utilizar PHP 5.0 o superior.

Armadillor dice:

Hola, empezando a trabajar con PHP, actualmente hago pruebas con sobre un IIS y me funcionan, pero este ejemplo trate de realizarlo pero me sale este mensaje cada vez que abro el servidor:

-
-
-
WSDL
SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘http://localhost:8080/soap/servidor.php?wsdl‘ : failed to load external entity “http://localhost:8080/soap/servidor.php?wsdl”
Notice: Undefined index: QUERY_STRING in C:\Inetpub\wwwroot\soap\servidor.php on line 10

Sera que alguno me puede explicar de que se trata.
Muchas gracias.

Armadillor dice:

Ya encontré el problema era enviar el parametro. Gracias

Jeyson dice:

Hola Alfredo, muy buen articulo, la verdad bastante claro.
Lo implemente tal cual cada uno de los pasos (SOAP) permo me sale el siguiente error al ejecutar el cliente :
atal error: Uncaught exception ‘Zend_Soap_Client_Exception’ with message ‘SOAP extension is not loaded.’ in C:\AppServ\www\Zend\Soap\Client.php:152 Stack trace: #0 C:\AppServ\www\soap\cliente.php(13): Zend_Soap_Client->__construct(‘http://localhos…‘) #1 {main} thrown in C:\AppServ\www\Zend\Soap\Client.php on line 152

Debes utilizar PHP 5.0 o superior.

Luis Jose dice:

Estimado Alfredo a ver si me das una mano
Estoy aprendiendo a trabajar con zend framework y me han dicho que tengo que hacer un web service, bueno usando el estandar de Open travel por ejemplo para vuelvos es http://www.opentravel.org/2010A/OTA_AirAvailRQ.xsd
tengo un monton de dudas no se como leo el archivo xml desde php o como lo mando en que momento asigno variables al xml?, por ejmplo en tu ejemplo como enviaria el xml que te mencione :( , a ver si me ayudas con esto por favor.

Gracias de Antemano

El estandar solo define como debes estructurar el XML. Lo que tienes que hacer es conseguir un parser de xsd a xml para que lo puedas trabajar.

Ivan dice:

Un excelente tutorial pero no me corre el webservices lo que no entiendo es del path esa parte no como deberia hacerlo.
quisiera saber como lo ejecuto tambien

Lo primero que tienes que hacer es instalar correctamente tu servidor web. Después de eso sigue los pasos del POST (cuidadosamente) y no deberías tener problemas.

Ivan dice:

C:\Program Files\EasyPHP-5.3.2i\www ahi esta todas las carpetas q hize esta bien?
tengo que colocar esta ruta en alguna parte del codigo

Esto depende de como hayas configurado tu servidor web, pero aparentemente es correcto.

Juan Carlos dice:

Hola alfredo;
trato de hacer con SOAP pero al abrir el cliente me da el siguiente error, Fatal error: Uncaught exception ‘Zend_Soap_Client_Exception’ with message ‘SOAP extension is not loaded.’ in C:\AppServ\www\Zend\Soap\Client.php:152 Stack trace: #0 C:\AppServ\www\soap\cliente.php(13): Zend_Soap_Client->__construct(‘http://127.0.0….‘) #1 {main} thrown in C:\AppServ\www\Zend\Soap\Client.php on line 152
; me podrias decir cual es el error si hice todo lo explicado

Aparentemente, tu servidor web no tiene instalado el módulo de SOAP. Esto probablemente se deba a que no tienes instalado PHP 5.0 o superior.

Excelente articulo!
me podria ayudarme a crear un web service que se conecta a una palm y lea el contenido de los contactos de esta. y llevarlos a la bd

gracias

esteban dice:

Hola Alfredo, primero felicitarte por el post! Era justo lo que necesitaba, o parte! jajaja
Debo hacerte una consulta, quiero consumir un método de ese WebService desde un celular.
Cual sería por ejemplo, el string que necesito armar?

Más especificamente desde un iPhone. Tengo que tener armado mi web service y consumirlo desde el telefono. Como debo armarlo??

Muchas gracias,

Naty dice:

Hola,
en caso de que necesitara el cliente necesitara utilizar un certificado de seguridad para recibir respuesta, como debería implementarse utilizando zend con php ?

Gracias!

Naty dice:

En el post anterior quise decir que el servidor requiere la firma de certificado digital, la empresa me proporcionó 3 archivos ca.crt, server.crt y client.p12.
Gracias!

Raul dice:

Tres mil quinientos millones de tutoriales leídos sobre webservices!!! Y por fin con el tuyo me entero y ademas FUNCIONA!!!!!!

Tres mil quininetos miloones de gracias!!!

Javier Siancas dice:

Alfredo,
Una consulta, esta creación del web service también me permite que lo consuma desde una aplicación hecha para iPhone?
Espero tu respuesta, porque en el trabajo que tengo que hacer un web service en PHP y consumirlo desde el dispositivo.
La verdad es que nunca he hecho un web service en PHP y tampoco tengo idea de como probarlo, pero me ha ayudado mucho el post para tener una idea mejor.

Gracias,

Deja un comentario

   

copstone en Facebook

Otros artículos

Cansado de crear tus reportes en archivos de texto, o Crystal Report?. Pues es hora que hagas tus reportes en PDF haciendo uso de una librería muy poderosa y gratuita.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

Agregar botones al formulario es bastante sencillo pero ¿qué tal agregar botones a la barra de título? Por ejemplo un botón para cambiar de estilo, o uno para cerrar documentos internos, en realidad el botón lo puedes usar para lo que quieras.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

Para finalizar esta saga, te dejo lo que hace falta: LLevar la información almacenada en el DataSet de regreso a la Base de Datos.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

A partir de windows vista, hay tareas que los programas no pueden ejecutar al menos que estén en modo administrador. En este artículo te voy a enseñar como puedes hacer que tus programas soliciten ejecutarse en modo administrador para que puedas realizar tareas específicas como escribir en el registro de windows, crear archivos en carpetas protegidas, etc.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

Tanti auguri! Llegamos a los 50! es momento de celebraciones y junto con la celebración les regalamos un programa.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

Calendario

marzo 2010
L M X J V S D
« feb   abr »
1234567
891011121314
15161718192021
22232425262728
293031  

Categorías

Comparte este artículo

  • Facebook
  • Google Bookmarks
  • Google Gmail
  • Twitter
  • Yahoo Mail
  • Hotmail
  • LinkedIn
  • Share
TIENES ALGO QUE PREGUNTAR? ESCRÍBENOS AQUÍ

Copyright © 2012 - Programando por diversion

Subir