6/9/2009

WebServices con NuSOAP en PHP - Ejemplo 1


Ya hace un tiempo realice un artículo sobre servicios web con PHP (utilizando NuSOAP), el mismo se puede acceder en WebServices con PHP usando NuSOAP, el mismo ya ha quedado un poco obsoleto debido a que el servidor que alojaba el webservice ya no lo contiene más. Por tal motivo y debido a que uno de los inconvenientes principales cuando uno se esta iniciando en el tema de los webservices con PHP, principalmente con NuSOAP, es encontrar como realizar el módulo servidor. En este primer post, decidí subir un ejemplo sencillo de comunicación entre un módulo servidor que provee expone una función, y un módulo cliente que las consume.

Introducción al ejemplo

No voy a exponer demasiados detalles con respecto a que son los WebServices, para ello pueden acceder al enlace que mencione anteriormente (WebServices con PHP usando NuSOAP). Solamente me limitare a explicar un poco el funcionamiento del mismo
Para el ejemplo, estoy utilizando la siguiente estructura de directorios


Siendo, nusoap_server_ej1.php el servidor de nustro WebService con NuSOAP, y nusoap_client_ej1.php el cliente.

Requerimientos

Los requerimientos para poner en funcionamiento el ejemplo son simplemente NuSOAP y tener algún servidor de sitios web (como puede ser Apache) corriendo PHP. Para todos aquellos que actualmente no tienen un servidor corriendo, pueden descargar XAMPP que es un servidor apache con PHP (también trae otras funcionalidades, pero estas 2 son las que importan para nuestro ejemplo) que solo se descarga, se descomprime, y con solo ejecutar un archivo, se inicia el servidor Apache con PHP en nuestra computadora, sin necesidad de mayores dolores de cabeza (Funciona tanto para Windows, como para OS-X).

Módulo servidor

El servidor de este ejemplo es muy sencillo, tan sencillo como el siguiente código:
<?php
 
// Incorporar la biblioteca nusoap al script, incluyendo nusoap.php (ver imagen de estructura de archivos)
require_once('nusoap/lib/nusoap.php');
// Modificar la siguiente linea con la direccion en la cual se aloja este script
$miURL = 'http://pruebas.orlandobrea.com.ar/nusoap_ej1';
$server = new soap_server();
$server->configureWSDL('ws_orlando', $miURL);
$server->wsdl->schemaTargetNamespace=$miURL;


/*
 * Ejemplo 1: getRespuesta es una funcion sencilla que recibe un parametro y retorna el mismo
 * con un string anexado
 */
$server->register('getRespuesta', // Nombre de la funcion
 array('parametro' => 'xsd:string'), // Parametros de entrada
 array('return' => 'xsd:string'), // Parametros de salida
 $miURL);
function getRespuesta($parametro){
 return new soapval('return', 'xsd:string', 'soy servidor y devuelvo: '.$parametro);
}

// Las siguientes 2 lineas las aporto Ariel Navarrete. Gracias Ariel
if ( !isset( $HTTP_RAW_POST_DATA ) )
    $HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );

$server->service($HTTP_RAW_POST_DATA);
?>
El ejemplo es bastante sencillo, simplemente registra una función que recibe un parámetro y devuelve dicho parámetro con un texto adelante ("soy el servidor y devuelvo: ". El parámetro de entrada a la función es del tipo String, y la función también retorna un String.
Anteriormente mencione que no iba a detallar demasiado en código, ya que como pueden ver el mismo esta comentado, y creo que es bastante entendible.
Como podemos ver en el ejemplo, la complejidad mayor en crear el módulo servidor para un webservice, es crear la estructura de datos del mismo y sus tipos (ver $server->register() en el ejemplo). Si bien el ejemplo es muy sencillo, podemos ver que tanto los datos que el webservice recibe, como los que retorna, deben ser especificados en los tipos de datos predefinidos en XML para crear un Schema (xsd:string, xsd:int, etc.). En los próximos ejemplos que vaya subiendo de webservices con NuSOAP se podrá ver más en detalle algunos tipos de datos, y también como crear estructuras complejas (retornar objetos, o listas). Por el momento solo estamos recibiendo un String (xsd:string y retornamos otro entero (xsd:string).
En el ejemplo se puede ver que la función a la cual el webservice llama para atender la petición, en este caso getRespuesta, debe codificar la respuesta en el tipo de datos esperado. En este caso definimos que la función retornaría un xsd:string, por lo que debemos crear un soapval con el tipo de datos esperado.

¿Como se enlazan los datos recibidos por el servidor con nuestra función?

Cuando definimos los parámetros, tanto de entrada, como de respuesta, a los mismos le asignamos un nombre. Por ejemplo al parámetro de entrada le asignamos el nombre "parametro" (si, no es muy original, pero sirve para entender el ejemplo). Y el parámetro de salida, o retorno, lo llamamos "return". Entonces lo que hará NuSOAP es enlazar el parámetro de entrada a la función getRespuesta cuyo nombre es "parametro", con el valor que tome el "parametro" definido en el webservice. Voy a mostrár graficamente el enlace, para que sea más sencilla su visualización:
 

¿Que pasa si mi función NO recibe parámetros?

Simplemente modificariamos el código de:
$server->register('getRespuesta', // Nombre de la funcion
 array('parametro' => 'xsd:string'), // Parametros de entrada
 array('return' => 'xsd:string'), // Parametros de salida
 $miURL);
al siguiente código:
$server->register('getRespuesta', // Nombre de la funcion
 array(), // Parametros de entrada
 array('return' => 'xsd:string'), // Parametros de salida
 $miURL);
y obviamente a la función que hacemo referencia (getRespuesta) no debería recibir parámetros, por lo que pasaría de:
function getRespuesta($parametro){
a:
function getRespuesta(){

El cliente

Para este ejemplo que estoy mostrando, el cliente tiene un poco más de código que el servidor, para ejemplos un poco más complejos, el servidor comienza a ser un poco más largo, y el cliente mantiene apróximadamente la misma longitud. ¿Por que pasa esto? sencillo, a medida que el ejemplo se hace más complejo, se necesitán funciones más complejas en el servidor y principalmente, definir que los datos que vamos a utilizar también son más complejos. Pero eso lo dejaremos para futuros ejemplos que vaya subiendo al blog. Ahora nos concentraremos en el cliente, cuyo código es el siguiente:
<?php
// Incluimos la biblioteca de NuSOAP (la misma que hemos incluido en el servidor, ver la ruta que le especificamos)
require_once('nusoap/lib/nusoap.php');
// Crear un cliente apuntando al script del servidor (Creado con WSDL) - 
// Las proximas 3 lineas son de configuracion, y debemos asignarlas a nuestros parametros
$serverURL = 'http://pruebas.orlandobrea.com.ar';
$serverScript = 'nusoap_server_ej1.php';
$metodoALlamar = 'getRespuesta';

// Crear un cliente de NuSOAP para el WebService
$cliente = new nusoap_client("$serverURL/$serverScript?wsdl", 'wsdl');
// Se pudo conectar?
$error = $cliente->getError();
if ($error) {
 echo '<pre style="color: red">' . $error  . '</pre>';
 echo '<p style="color:red;'>htmlspecialchars($cliente->getDebug(), ENT_QUOTES).'</p>';
 die();
}

// 1. Llamar a la funcion getRespuesta del servidor
$result = $cliente->call(
 "$metodoALlamar", // Funcion a llamar
 array('parametro' => 'Orlando'), // Parametros pasados a la funcion
 "uri:$serverURL/$serverScript", // namespace
 "uri:$serverURL/$serverScript/$metodoALlamar" // SOAPAction
);
// Verificacion que los parametros estan ok, y si lo estan. mostrar rta.
if ($cliente->fault) {
 echo '<b>Error: ';
 print_r($result);
 echo '</b>';
} else {
 $error = $cliente->getError();
 if ($error) {
 echo '<b style="color: red">Error: ' . $error . '</b>';
 } else {
 echo 'Respuesta: '.$result;
 }
}

?>
Primero voy a hacer un breve resumen de cuales son los pasos que se realizan.
  • Incluír la biblioteca de NuSOAP de PHP.
  • Defino las variables de configuración (lo hice de esta forma para que les sea más sencillo el definir los parámetros para sus propios servicios web).
  • Creo el objeto NuSOAP Cliente (nusoap_client).
  • Verifico que la conexión se haya podido realizar.
  • Llamó al servicio web del servidor (función getRespuesta definida en las variables de configuración).
  • Verifico que la llamada haya sido exitosa, en caso de ser exitosa muestro la respuesta del servidor, y en caso de error, muestro el mensaje de error.
El código del cliente también esta comentado, y definí 3 variables al principio que nos permitirán adaptar el cliente del WebService a nuestras pruebas particulares.
En el cliente no hago un procesamiento de la información recibida desde el servidor de WebServices (NuSOAP server) sino que la muestro directamente por pantalla, cuando estemos trabajando realmente con dicha información debemos realizar un procesamiento de la información recibida antes de utilizarla (el procesamiento puede ser desde algo tan sencillo como mostrar la información en un sitio especifico del website, hasta generar tablas o campos de edición). Las posibilidades de procesamiento son infinitas, y dependen de para que estemos utilizando el WebService, y la información otorgada por el mismo.

Verificación de los scripts

Para comprobar que nuestros scripts estan funcionando, lo que primero recomiendo es primero acceder al script del servidor (http://<direccion de nuestro server>/nusoap_server_ej1.php) desde nuestro navegador, el cual nos debe mostrar una pantalla similar a la siguiente si todo esta correcto (en caso contrario mostrará un típico error PHP por pantalla):

Y si hacemos click sobre el nombre la la función que hemos publicado en nuestro servidor de WebService, nos mostrará algo similar a esto:

Cuando hemos verificado que el servidor esta funcionando, ahora realizaremos la prueba del cliente (http://<direccion de nuestro server>/nusoap_client_ej1.php), y nos mostrará una página similar a la siguiente:

Conclusión

El WebService aquí presentado es un ejemplo básico para todas aquellas personas que estan comenzando con ellos y desean utilizar NuSOAP para crear los mismos y consumirlos.  El código del ejemplo es muy sencillo, pero igualmente decidí publicar un archivo con el ejemplo del cilente y el servidor, para que sea más sencilla la implementación del ejemplo en sus computadoras (Descargar el ejemplo).

35 comentarios:

edipotrebol dijo...

Muchas gracias por estas excelentes expliaciones, tanto este artículo como el otro. Estuve probándo este último y me daba un error (no había leído tu comentario acerca de que el servicio web meteorológico había caído...)
Ps.: Pablo desde España.

Orlando dijo...

Muchas gracias Pablo por tus comentarios. Si el servicio web meteorológico se encuentra fuera de servicio desde hace un tiempo. Por eso decidí hacer un cliene y servidor propios, para que no queden obsoletos los ejemplos. También publique la segunda parte del artículo:
http://www.orlandobrea.com.ar/2009/09/webservices-con-nusoap-en-php-ejemplo-2.html que también te puede interesar. Ya tengo desarrollada la tercera parte, pero aún no la he publicado. Nuevamente gracias.

titon dijo...

buenos dias Orlando la verdad esta excelente tu tutorial. ahora bien tengo una pregunta como podria yo hacer para pasar un archivo.. es decir tengo un archivo en el servidor y desde el cliente le paso el nombre del archivo y se lo retorno bueno saludos
mi nombre es dixon raffe mi correo es
dixon1002@gmail.com

Orlando dijo...

Titon, muchas gracias. Aproveche tu inquietud para publicar un nuevo post en mi blog
http://www.orlandobrea.com.ar/2009/12/como-transferir-archivos-con-nusoap.html

Ahí podes ver un pequeño ejemplo de como hacer dicha transferencia de archivos. Espero te sea de utilidad. Saludos.

correocualqui dijo...

Orlando es muy bueno tu blog con estas explicaciones. Quise implementar tus ejemplos pero me sale este error: Error: wsdl error: HTTP ERROR: Unsupported HTTP response status 404 Not Found (soapclient->response has contents of the response).
Tienes alguna idea que puedo estar seteando mal? saludos y gracias de antemano

Orlando dijo...

Hola. Me alegra que te haya gustado el blog y las explicaciones.

Con respecto al error "Error: wsdl error: HTTP ERROR: Unsupported HTTP response status 404 Not Found"

Parece que el cliente no esta encontrando el servidor. Por favor verifica la siguiente linea en el cliente:

"$serverURL = 'http://pruebas.orlandobrea.com.ar';"

si la has modificado para que apunte a tu servidor (quizás algo como $serverURL = 'http://127.0.0.1';"

Te pido que me avises si el inconveniente se planteaba ahí, sino seguimos investigando.

Saludos.

Orlando

correocualqui dijo...

Orlando gracias por contestar. Si bien yo tenía bien apuntado el $serverURL, parece que no funciona con el certificado SSL que tengo instalado, porque cuando lo probé en otro de mis sitios normales, andubo de maravillas. Gracias por tus aportes.
Aprovecho para preguntarte si sería posible que nos dejes un ejemplo donde se pueda devolver varios registros de una misma consulta. Por ejemplo: el cliente llama con $result = $client->call("MetodoWebService",
array('Pais' => 'Argentina')
y el ws nos devuelve todas las ciudades que tenga ese país.
Estuve varios días tratando de resolverlo a partir de tus ejemplos pero no he podido ya que los mismos devuelven un array simple.
Espero me puedas ayudar con esto, desde ya gracias totales
Diego

Orlando dijo...

Hola Diego.

Que bueno que hayas podido solucionar el problema que se te presentaba (a veces los certificados, traen dolores de cabeza).

Me podrías detallar como sería la respuesta que estas esperando del servidor de WebService? Es decir, el cliente envía array("Pais" => "Argentina") y el servidor responde...

Si me pudieras dar un ejemplo de como esperas la respuesta del servidor, hago un ejemplo con esos datos.

Saludos

correocualqui dijo...

Ok, voy a intentar explicar mi problema más en detalle.
Suponte que del lado del cliente yo necesite varios resultados de una misma consulta, como el ejemplo que te indicaba en mi anterior post.
El cliente envía una consulta con un filtro como puede ser "Argentina", y el wserver lo procesa para devolver (suponte) nombre, poblacion y altura (de cada ciudad de Argentina.
En tus ejemplos pude lograr mostrar solo los datos de una sola ciudad porque devuelve un array simple, pero no lo he logrado de varias ciudades al mismo tiempo.
Espero haber sido un poco más claro... y como dice el maestro Ceratti... Gracias totales. Diego

Orlando dijo...

Hola Diego,

voy a intentar realizar un post con el ejemplo que me pasaste, solamente dame algunos días para poder hacerlo y subirlo.

Saludos.

correocualqui dijo...

Bárbaro Orlando, sigo probando cosas pero sin buenos resultados. Espero no complicarte. Abrazos de Buenos Aires

Humberto Alvarez dijo...

Excelente ejemplo, claro y conciso. Solo tuve un pequeño problema con la sentencia require_once('nusoap/lib/nusoap.php');, la cual tuve que recomponer de la siguiente forma: require_once('lib/nusoap.php');

F E L I C I T A C I O N E S!

Orlando dijo...

Estima Humberto,

Muchas gracias por tu comentario. Voy a chequear la linea que me informas (yo tengo la libreria nusoap en nusoap/lib, pero creo que no lo aclare). Mas tarde lo chequeo y corrijo la informacion.

Muchas gracias

Anónimo dijo...

Hola! Gracias por el aporte. No tengo idea de que es WebServices, iba a hacer un curso pero se cayó, así que me puse a buscar para aprender algo por mi cuenta.
Saludo!

Tony

Anónimo dijo...

oye olrando cuando intento corro el archivo del servidor me mansa este mensaje Notice: Undefined variable: HTTP_RAW_POST_DATA in C:\wamp\www\webserver\servidor.php on line 23

y en el cliente este Error: wsdl error: XML error parsing WSDL from http://localhost/webserver/servidor.php?wsdl on line 2: Invalid document end
Bueno gracias

Orlando dijo...

Hola. Aún no he tenido tiempo de probar una solución para esto, pero en la web encontre la siguiente.

Antes de utilizar la variable, pegar el siguiente código:

if ( !isset( $HTTP_RAW_POST_DATA ) )
$HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );


El crédito es para una persona llamada "RAJ GOHIL".

Te pido que por favor lo pruebes, y en caso que no funcione, realizare yo mismo algunas pruebas.

Saludos
E

La Garridera 2008 dijo...

Hola Orlando. Primero. Que bueno que hay gente como tu que se toma el tiempo de escribir estos tutoriales. Gracias.

Bueno, ojala me puedas ayudar pero, el ejemplo del cliente no me funciono :( (creo que soy el único). No sé si tenga un error en las direcciones pero no funciona. El server si funciona perfectamente, pero el cliente no.

Yo tengo mis archivos aqui: http://localhost/danielgarrido.com/nusoap/. En esta carpeta tengo tanto las librerias como los ejemplos que tu has dado.

Entonces, supongo que las direcciones quedarian algo como esto:

En server:
$miURL = 'http://localhost/danielgarrido.com/nusoap';

En Cliente:
$serverURL = 'http://localhost/danielgarrido.com/nusoap';
$serverScript = 'nusoap_server_ej1.php';
$metodoALlamar = 'getRespuesta';

Ah! el error que me da el cliente es que se queda en blanco la pantalla leyendo infinitamente. En la barra de estado del FireFox se queda en "Esperando a localhost...". Obviamente esta como en un ciclo infinito.

Bueno Orlando, espero me puedas ayudar ya que estoy urgido con esto.

Muchas gracias!!

Orlando dijo...

Hola Daniel,

Si tu sitio web esta en http://danielgarrido.com (como sospecho), el inconveniente esta en que en la URL que apunta al servidor la siguente linea:

$serverURL = 'http://localhost/danielgarrido.com/nusoap';

deberia ser

$serverURL = 'http://danielgarrido.com/nusoap';

es decir, sin el localhost (para que no apunte a la computadora local, sino a la que esta publicada en internet).

Te pido que me informes si con esa modificación funciona el ejemplo.

Gracias por tus comentarios

La Garridera 2008 dijo...

Orlando. Muy agradecido por tomarte tu tiempo en responder.

Claro, tiene "localhost" porque quisiera que funcionara localmente.

Sabes que cuando publico el server en danielgarrido.com y corro el cliente en mi compu, apuntando al server de internet, funciona perfectamente. Pero cuando apunto al server local, no.

Lo bueno es que tengo la manera de probar el ws, pero hacerlo local es como lo ideal antes de publicar.

Muchas gracias de nuevo Orlando.

Orlando dijo...

Sin ver realmente como esta todo, solo se me ocurren dos alternativas:

1. Que http://localhost/danielgarrido.com no este en la carpeta que se espera. Que sería dentro de htdocs (o el document root del servidor web) / danielgarrido.com (una carpeta llamada "danielgarrido.com" dentro del document root.

2. También puedes probar reemplazar localhost por 127.0.0.1

En caso que este apuntando correctamente, y al reemplazar localhost por 127.0.0.1 igualmente sigas teniendo este inconveniente, me puedes enviar un zip con el ejemplo a orlando.brea at gmail.com para que lo pueda ver.

Saludos.

Dref dijo...

Buenas noches.
En primer lugar, quería darle la enorabuena tanto por el artículo como por los ejemplos. Son muy ilustrativos y sirven de gran ayuda. De echo a mi me funciona todo el ejemplo perfectamente.
En segundo lugar, comentar que bueno, soy un programador amateur de php y debido a unas necesidades laborables tengo que montar un webservices para compartir datos con otra compañía y me gustaría hacerlo en php ya que he comprobado que funciona perfectamente.

Mi duda es la siguiente:

Dicha compañía me ha enviado un monton de archivos wsdl y xsd y sinceramente no se por donde empezar ya que según ellos me han mandado la estructura del web services pero soy incapaz de verlo.

Ya que he observado que usted controla bastante del tema, sería tan amable de orientarme sobre que tengo que hacer con esos archivos para montar los distintos web services?

Iba a poner mi correo para que me contestase pero he pensado que sería mejor exponerlo por aquí por si a otra persona le pudiese ser de ayuda también
Se lo agradezo de ante mano.

Desde España, un saludo cordial.

Orlando dijo...

Estimado Dref, muchas gracias por tus comentarios. Te recomiendo para comenzar leer el siguiente tutorial que realice ya hace algunos años en el cual, en los primeros capítulos, trata por arriba la estructura de los webservices y como se realizán las definiciones de los mismos:

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

En el archivo wsdl ya tienes toda la información que necesitas para conectarte y utilizar el webservice, ya que en el wsdl esta toda la definición de los puntos de accesos/métodos y los tipos de datos que debes utilizar para enviar y recibir datos de los mismos. Los datos pueden estar un poco complejos de seguir, pero con paciencia puedes detectar cada uno de ellos.

No conozco aplicaciones gratuitas que te permitan ver facilmente el contenido del wsdl para acelerarte este proceso. Igualmente, estoy seguro que con un poquito de dedicación podrás comprender como operar con el mismo.

Espero haberte servido de ayuda, y que nos comentes como te ha ido con el wsdl.

Saludos

Bernal dijo...

Hola Orlando!

Se que este comentario va a un post que ya es muy viejo, pero ya que nunca te contestaron acerca de la solución que aportaste para el asunto del error: "HTTP_RAW_POST_DATA", solo quiero informar que funciona perfectamente, es solo cuestion de colocar el codigo que señalaste justo antes de la linea: "$server->service($HTTP_RAW_POST_DATA);"

Puede ser muy util para los que todavia tienen ese problema...

Saludos!

Bernal R.
Costa Rica

Bernal dijo...

Ah, y se me olvidaba comentar... Excelentes tutoriales!!! Felicitaciones!

Sigue así, que estos nos ayudan mucho!!!

Saludos,

Bernal R.

Orlando dijo...

Muchas gracias Bernal por el feedback y mil gracias por los comentarios. Es un placer hacer algo que a los demas le sea de utilidad.

Saludos.

Ariel Navarrete dijo...

Excelente Articulo, a la fecha aun funciona sin ningun problema, mis felicitaciones, solo falta corregir que:
"$server->service($HTTP_RAW_POST_DATA);"

Debe quedar:

if ( !isset( $HTTP_RAW_POST_DATA ) )
$HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );
$server->service($HTTP_RAW_POST_DATA);

Y si alguien quere agregarle mas parametros de entrada, seria:

en cliente.php

result = $cliente->call(
"$metodoALlamar", // Funcion a llamar
array('num1' => $x, 'num2' => $y), // Parametros pasados a la funcion, en este caso 2

y en servicio.php

$server->register('Suma', // Nombre de la funcion
array('num1' => 'xsd:string', 'num2' => 'xsd:string'), // Parametros de entrada, en este caso 2

...

function Suma($num1, $num2)
//y la funcion debe tener los parametros a utilizar

Obviamente tiene algunos nombres cambiados debido a que la modifique, pero es la idea para que trabajen :)

Muchas Gracias estimado,

Atte, Ariel

Orlando dijo...

Muchas gracias Ariel por tus comentarios y aportes. Más tarde modifico el ejemplo tal cual tu lo comentas.

Hilario Disla dijo...

Buenas Orlando excelente ejemplo llevandome de eso realize este web service pero no se nesesito que cuando se llene el formulario me responde segun los parametro que le pase pero me sale error podria darme una mano o decirme que tal lo ves Saludos

* @url http://www.joom4u.com
*/
defined( '_JEXEC' ) or die( 'Restricted access' );

$document =& JFactory::getDocument();
$document->addStyleSheet(JURI::base().'components/com_j4uform/css/style.css');
//$document->addScript(JURI::base().'components/com_j4uform/js/gen_validatorv5.js');
$task = JRequest::getVar( 'task', '' );

switch ($task) {
case 'certify':
certify();
break;
case 'certify2':
certify2();
break;
default:
certify();
break;
}

function getconfig($varname) {
$db =& JFactory::getDBO();
$query = "SELECT value FROM #__j4uform WHERE varname = '".$varname."'";
$db->setQuery( $query );
return $db->loadResult();
}

function sendHTMLemail($HTML,$from,$to,$subject)
{
$subject='=?UTF-8?B?'.base64_encode($subject).'?=';

$headers = "From: $from\r\n";
$headers .= "MIME-Version: 1.0\r\n";

$boundary = uniqid("HTMLEMAIL");

$headers .= "Content-Type: multipart/alternative;".
"boundary = $boundary\r\n\r\n";
$headers .= "This is a MIME encoded message.\r\n\r\n";
$headers .= "--$boundary\r\n".
"Content-Type: text/plain; charset=UTF-8\r\n".
"Content-Transfer-Encoding: base64\r\n\r\n";
$headers .= chunk_split(base64_encode(strip_tags($HTML)));
$headers .= "--$boundary\r\n".
"Content-Type: text/html; charset=UTF-8\r\n".
"Content-Transfer-Encoding: base64\r\n\r\n";
$headers .= chunk_split(base64_encode($HTML));

mail($to,$subject,"",$headers);
}
/**
QUE HACE ESTO ??!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

Hilario Disla dijo...
Este comentario ha sido eliminado por el autor.
Hilario Disla dijo...

me puede dar tu correo o escribeme aqui dislanet@gmail.com. porque no me acepta el code completo te lo agradeceria Saludos

RobertoZ dijo...

Sé que es muy tarde pero bueno... Muy buenas Orlando. En primer lugar felicitarte por estos tutoriales de NuSoap, son excelentes.
Bueno, te cuento mi problema. Accedo al servidor perfectamente, pero cuando ejecuto el cliente me devuelve este error: Error: wsdl error: Getting http://x.x.x.x/pruebas/ServidorWeb/Ejemplo_1/server_ej1.php?wsdl - HTTP ERROR: HTTP authentication failed

Sabes qué puede ser? Gracias amigo!

jorge dijo...

hola, felicitaciones y gracias por toda esta informacion.

resulta que hago todo lo que explicas en el tutorial pero al reemplazar en el archivo cliente la url por localhost me arroja este error "Error: wsdl error: Bad path to WSDL file localhost/nusoap_server_ej1.php?wsdl".
a que se debe ese error. cuando pruebo independiente al archivo servidor funciona perfecto, saludos y gracias por tu ayuda

Anónimo dijo...

AMIGO UNA CONSULTA NO SE MEDO CALRO ESTE CODIGO
"$server->service($HTTP_RAW_POST_DATA);"

LO PONGO EN LE SERVIDOR O CLIENTE

Enail dijo...

Hola, soy principiante en WS, necesito conectarme a uno en aspx desde Drupal, no he dado con ningún módulo que me funcione y quiero hacerlo en php puro. Me sirve la librería nusoap para esto?
Orlando muy bueno tu trabajo aquí, Saludos

Orlando dijo...

Disculpen pero no he tenido tiempo para responder sus consultas. Seguramente varios ya han resuelto los temas. Intentare hacer un resumen para responder a todos.

El $server->service($HTTP_RAW_POST_DATA); va en el server.

El error "HTTP ERROR: HTTP authentication failed" posiblemente sea porque la conexion se esta haciendo a un server apache que necesit autenticacion para poder acceder a la pagina (para esto recomiendo mirar el archivo httpd.conf y .htaccess)

La interaccion php-aspx no siempre es muy buena. Si bien webservices iba a ser la plataforma de interconexion entre cualquier plataforma, a cualquier otra, no termino siendo tan asi. Existen ciertos problemas entre webservices en diferentes lenguajes (no con todos pasa esto). Si bien hace un tiempo que no hago pruebas, antes los clientes php, no funcionaban muy bien con los servidores .net. Quizas hoy ya este solucionado, pero no te puedo dar seguridad que esto sea asi).

Se que los que me postean problemas que se les presentan cuando estan trabajando con webservices esperan una respuesta, pero como ustedes sabran, el blog lo mantengo de forma "amateur", es decir, no tengo ingresos por el mismo, y por lo tanto, le puedo dedicar el tiempo que me sobra (que es muy poco), y por lo tanto los tiempos de respuesta pueden ser muy largos. Se que lo sabran entender, ya que sus tiempos tambien son muy valiosos (y saben que no pueden destinar mas tiempo del que tienen, y no le pueden sacar tiempo a otras actividades que).

Muchas gracias por su comprension.