Ejemplo de como Consumir un Web Service utilizando NuSOAP y PHP ( Parte II)

Gracias a un comentario recibido en mi blog con respecto al ejemplo anterior (http://www.mauricioalpizar.com/ejemplo-de-como-programar-un-web-service-utilizando-nusoap-y-php/) de como programar un WebService del lado del servidor, no puse el ejemplo de como consumirlo.

Aquí les dejo el ejemplo de como consumir el WebService utilizando NuSOAP y PHP

Copias el siguiente código y lo colocas en un archivo .php, recuerda el include de la libreria nusoap.php

<pre>
<?php

	require_once('lib/nusoap.php');
	
	$cliente = new nusoap_client('http://www.mauricioalpizar.com/ejemplos/nusoap/mi_ws1.php');
	//print_r($cliente);
	
	$datos_persona_entrada = array( "datos_persona_entrada" => array(	
																	'nombre'  	=> "Mauricio A.",
																	'email'		=> "ealpizar@ticosoftweb.com",
																	'telefono'	=> "8700-5455",
																	'ano_nac'	=> 1980)
																	);

	$resultado = $cliente->call('calculo_edad',$datos_persona_entrada);
	
	print_r($resultado);
	
?>
</pre>

El resultado deberia ser algo asi:

Array
(
    [mensaje] => Hola, Mauricio A.. Hemos procesado la siguiente información ealpizar@ticosoftweb.com, telefono8700-5455 y su Edad actual es: 34.
)

Url del Ejemplo: http://www.mauricioalpizar.com/ejemplos/nusoap/consumo-ws.php

Espero les ayude!.

Comando tar para comprimir archivos en Linux

Aquí les dejo un aporte sencillo para cuando necesitamos comprimir un directorio en linux para exportarlo a nuestro pc u otro servidor.

Para comprimir un directorio simple, sin exluir.

tar -zcvf nombre-nuevo-archivo-comprimido.tar.gz /ruta/directorio-a-comprimir

Si queremos comprimir un directorio pero deseamos exluir algun otro, en la Consola (shell) ejecutamos el comando:

tar -zcvf nombre-archivo.tar.gz --exclude='/ruta-a-excluir' /ruta-directorio-comprimir/

Para descomprimir:

En consola:

tar -zvxf archivo-a-descomprmir.

Mejores Prácticas para Administradores de Seguridad.

Recientemente leí un artículo muy interesante sobre Mejores Prácticas para Administradores de Seguridad. Acá les dejo la traducción del artículo.

No es fácil lidiar con la responsabilidad de la gestión de dispositivos. Después de todo, usted es el responsable de mantener las cosas funcionando sin problemas. Hoy en día, los diseños de red no sólo se centran en proporcionar acceso, velocidad de conexión o plataformas de apoyo, sino que también se ocupan de la seguridad de red.

Esta es una lista de 10 buenas prácticas que todos los administradores de seguridad deben tener en cuenta al tratar con este rol.

1. No asuma, es mejor preguntar!

Mientras que algunos administradores de red piensan que hacer muchas preguntas a los usuarios finales es molesto para ellos, asumir los requisitos o requerimientos técnicos puede ser un arma peligrosa para usted mismo. Recuerde que todo el equipo de seguridad debe estar configurado para permitir sólo los puertos y los servicios requeridos. Abrir puertos innecesarios en su equipo, expone a otros dispositivos o aplicaciones a posibles intrusos.

Por lo tanto, los buenos administradores de la red siempre solicitan información explícita de los usuarios finales. Por ejemplo, las direcciones específicas de TCP / UDP, IP de origen y destino, entre otros. En caso de que un usuario o cliente final no tenga esta información, puede ponerse en contacto con el proveedor de la aplicación o el administrador del servidor donde se aloja la aplicación.

2. Ser riguroso! Siempre entender los requisitos para cualquier configuración

Es una práctica común tomar peticiones de los usuarios y procesarlas inmediatamente, pero esto no siempre es bueno. Muchas solicitudes de servicio se pueden resolver sin cambiar nada en la configuración del firewall/cortafuegos.

Algunos usuarios, la mayoría de ellos, usuarios no técnicos, tienden a crear solicitudes sin requisitos de doble control. Como ejemplo, piense en los usuarios que revisan los requisitos de conectividad de aplicación en la página web del proveedor, y luego abren una solicitud de ciertos puertos de esa aplicación a su computadora. En la mayoría de los casos con las aplicaciones alojadas en Internet, la conexión se inicia siempre desde la red interna a Internet, por lo que en este caso la capacidad de estado de los servidores de seguridad es suficiente para que las cosas funcionen, por lo que no se requieren cambios en este caso.

3. Evite el uso de rangos de IP y rango de puertos

Se han visto algunos casos donde se utilizan listas de acceso para permitir completo acceso a la red, en lugar de accesos individuales para evitar una configuración adicional si el destino de IPs cambia. Esto ayuda al administrador para minimizar su trabajo, pero no es una buena práctica en absoluto. ¿Por qué permitimos el acceso a toda la red DMZ desde internet si sólo uno o dos IPs destino es necesarias? En tales casos, es mejor crear objetos y cambiar sus IPs si es necesario, en lugar de añadir toda la red a una lista de acceso.

Esta misma situación ocurre con los puertos TCP y UDP. Trate de evitar todo el permiso del protocolo IP cuando sólo puertos TCP o UDP específico son necesarios. Usted puede incluso permitir rangos de puertos o crear un grupo si hay varios puertos en la solicitud.

Recuerde siempre que un acceso mínimo, para garantizar un perímetro seguro.

4. Evitar el acceso al medio interno de las redes no seguras

La segmentación de la red es un principio básico de la seguridad de la red. Los cortafuegos permiten configurar zonas de seguridad para segregar la red, pero esto también depende de la plataforma que está utilizando. Cisco, por ejemplo, permite asignar un nivel de seguridad a las interfaces, el tráfico de mayor nivel de seguridad hasta de bajo nivel de seguridad está permitido por el cortafuegos, pero el tráfico de nivel inferior de seguridad al superior debe ser explícitamente permitido con una lista de acceso.

Cuando se requiere el acceso desde Internet a un recurso interno, ese recurso no debe ser instalado en la red interna. Pensemos en un servidor web que debe ser accesible por los clientes desde sus oficinas. Si ese servidor está comprometido puede ser utilizado para atacar a otras aplicaciones y / o para extraer información de la red interna. Si se requiere el acceso a este servidor debe estar instalado en una DMZ, sin acceso a la red interna.

5. Añadir el tráfico de salida a sus controles diarios

Los cortafuegos son esenciales para la seguridad de la red, pero no son todo lo necesario. Otros actores como NIPS, HIPS, DLP, Antivirus son parte de una solución de seguridad completa. Entonces, firewalls no pueden detener a todos los intrusos y no son eficaces contra la pesca (fishing), el malware, documentos adjuntos a mensajes de correos electrónicos o troyanos.

Cuando se compromete un host interno, podría comenzar inundaciones de tráfico a Internet de su red. De este modo, mediante la supervisión del tráfico saliente de la red interna de Internet podría ser útil para detectar comportamientos inesperados.

6. Tenga cuidado! con Grant Access a terceros …

En algunas situaciones, los terceros tendrán que tener acceso a los recursos internos. Para resolver este requisito, un tercero puede ser asignado a una cuenta de VPN temporal para concederles acceso a la red interna. En otros casos, si necesitan acceso a una aplicación para proporcionar apoyo, la lista de acceso explícita se puede configurar. Estos dos escenarios no están nada mal.

El problema con este tipo de configuración es cuando se configuran de forma permanente. La mayoría de las veces no hay una justificación para mantener ese acceso permanente a los puertos de administración tales como SSH o Escritorio remoto. Es una buena práctica configurar entradas de control de acceso con rangos de tiempo para desactivar el acceso de forma automática, o hacerlo manualmente mediante la adición de “inactivo” al final de la línea (Cisco).

7. ¿Audita sus propios dispositivos?

A nadie le gusta tener los auditores comprobando la configuración de la red y de los equipos. Una solución que he encontrado para mantener a los auditores felices es auditar mi propio equipo para estar un paso adelante de ellos.

Hay algunas herramientas en la web que le permiten identificar piezas de configuración que podrían ser ajustadas. RAT, por ejemplo, es una buena herramienta para comprobar la configuración de su router y que informe si se puede hacer algo para mejorarlo. Nmap es buena herramienta de código abierto para escanear la red para encontrar hosts conectados inesperados e identificar los puertos abiertos que pueden ser cerradas.

8. ¿Está haciendo cambios sobre la marcha?

Una de las peores experiencias de ser un administrador de red es presionar la tecla enter y luego pérder la conectividad del dispositivo. Por supuesto, esto sucede cuando usted hizo algo mal en la configuración – los errores humanos.

Pero el verdadero problema es la falta de un proceso de gestión del cambio adecuada, para identificar los cambios de emergencia para ser aplicados inmediatamente después de la aprobación de la gerencia superior. Recuerde que todos los cambios hechos a la configuración deben estar justificadas. En la mayoría de las situaciones, los cambios se deben planificar, justificar y aplicar durante las ventanas de mantenimiento, para evitar un impacto alto en el negocio si algo sale mal.

Al hacer cambios sobre la marcha durante las horas de producción, usted se está exponiendo y a otros usuarios a problemas de conectividad si algo falla. Entonces, un buen proceso de gestión del cambio debe estar en su lugar para evitar el impacto negativo de negocio.

9. Entender siempre los requisitos de los usuarios primero

Uno conceptos erróneos acerca de la red y los administradores de seguridad es que su trabajo es sólo para entrar y eliminar la configuración de los dispositivos. Esto es absolutamente equivocado! Ellos son responsables de conocer la red, identificar el tráfico esperado e inesperado, y también, para justificar los cambios en los servidores de seguridad y otros equipos.

Por lo tanto, un buen administrador de la red comprende requisitos de las aplicaciones y hace preguntas si es necesario. Algunas preguntas que deben responderse antes de implementar cualquier cambio son:

a) ¿Quién va a acceder a la aplicación?
b) ¿Debe estar activo este acceso 24/7? o puede el plazo se reducirá a horas específicas?
c) ¿Por cuánto tiempo será necesario este acceso?
d) ¿Es este un acceso permanente o temporal?
f) ¿Hay alguna otra manera de permitir el acceso a la aplicación?

 10. Su jefe no siempre tiene la razón!

Algunas personas, incluyendo jefes, les gustan ser amable con los usuarios finales al decir “sí” a cualquier requisito, antes de pensar en las consecuencias de seguridad. Sé que es fácil decirlo, pero ser un buen ingeniero de seguridad debe siempre guardar su postura acerca de la seguridad, incluso en presencia de su jefe.

Usted siempre tiene que dar su retroalimentación sobre cualquier acceso, incluso si no se le pide. Incluso si él o ella es su jefe, se requiere su colaboración, después de todo, esa es la razón por la que fueron contratados, ¿verdad? Usted es el experto!

En algunas situaciones, debe redactar un correo electrónico informativo con observaciones de un cambio que podría exponer nuestro medio ambiente, y pregunte por la aprobación para su ejecución. Después de todo, si su jefe aprueba el cambio usted tiene una prueba escrita de que ya ha proporcionado sus comentarios y que su jefe aprobó el cambio.

Referencia: http://bestitsource.com/2014/11/25/best-practices-for-security-administrators/

Buenas Prácticas de Esquemas de Seguridad para MySQL 4.1,5.0,5.1

Recientemente fuimos participes de un proceso de Auditoría, durante el proceso fueron evaluados unos equipos que brindaban servicios a uno de nuestros principales clientes.Surgieron muchas recomendaciones importantes como lo es usual en estas evaluaciones.

Me llamó mucho la atención el documento de resultados y que estaba propiamente vinculado con el tema de Buenas Prácticas sobre la configuración de Seguridad para MySQL 4.1, 5.0, y 5.1 de la versión Community Edicion. Documento proporcionado por la organización http://cisecurity.org/,

Aqui les dejo el link del Benchmark v1.0.1

http://benchmarks.cisecurity.org/downloads/show-single/?file=mysql.101

Sin duda alguna conocer de estos temas tan importantes cuando realizamos configuración de equipos (servidores) mitiga cualquier hueco de seguridad en nuestras plataformas,  contar con una herramienta o varias herramientas que nos diagnostique como se encuentran nuestros servidores (si contamos con mas de uno), no deja de ser una tarea de más…, si así lo queremos ver; si no mas bien mejora nuestros procesos de calidad y esquemas de seguridad.

Herramientas para determinar el desempeño de WebSite.

Muchas veces cuando construimos un sitio Web nos topamos con el comentario: “Por qué el sitio está tan lento, lo noto lento“; y empezamos a pensar debe ser el servidor, no!, pero también puede ser un tema de conexión, ah!, pero puede ser que su máquina “la del cliente ó usuario” este lenta.

Bueno, para todo este tipo de aspectos existen herramientas, entonces antes de liberar un sitio Web es importante realizar pruebas de calidad a nuestro Web Site, para mitigar todos estos aspectos y descartar que sea un problema de nuestro WebSite como cuando las imágenes están muy pesadas, nuestros scripts de jquery o javascript no esta “minify” ó comprimidos, el tema de cache esta con un lifetime muy corto, y son recursos que por lo general cambian poco.

Aqui les dejo una herramienta para este tipo de aspectos importantes a realizar antes de entregar el sitio Web si quieren garantizar un WebSite de alto nivel.

http://developers.google.com/speed/pagespeed/insights/

FireFox también tiene un pluging que le muestra indicadores interesantes llamado pageSpeed y lo puedes integrar a tu herramientas de desarrollador.

 

 

 

 

 

 

Android ListView con filtro de búsqueda

En mi tiempo de ocio y como parte de mi proceso de aprendizaje en Android me di la tarea de como crear un listview con un filtro de búsqueda, luego al darle click al Item, me mostrara en un mensaje Toast el item seleccionado de la lista.

Aquí les dejo el código por si lo llegan a necesitar.

Creamos dos layouts el principal y el de la lista items.

lista_tokens.xml (layout principal)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

 <!-- Editext para busqueda  -->
    <EditText android:id="@+id/inputSearch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="Código Proyecto.."
        android:inputType="textVisiblePassword"/>    

     <!-- List View de elementos  -->
    <ListView
        android:id="@+id/list_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

list_item.xml ( Layout que sera utilizado para cargar cada item del arreglo o vector )

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    
 <!-- Codigo de Proyecto  -->
    <TextView android:id="@+id/codigo_token"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:textSize="16dip"
        android:textStyle="bold"/> 
</LinearLayout>

Mi actividad principal se llama: lista_proyectos.java ( recordar que esto tiene que estar en el AndroidManifest.xml)

lista_proyectos.java

import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class lista_proyectos extends Activity {
    
    private ListView lv;
    
    ArrayAdapter<String> adapter;
    
    EditText inputSearch;
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lista_tokens);
        
        
        // Arreglo de codigos de proyecto.
        String tokens[] = {"ABCD","BCD","EDFT","JGUR","AJHE","IKQ2","LKWW","W4T6","EMA1"};

        lv = (ListView) findViewById(R.id.list_view);
        lv.setTextFilterEnabled(true);
        inputSearch = (EditText) findViewById(R.id.inputSearch);
    
        adapter = new ArrayAdapter<String>(this,R.layout.list_item, R.id.codigo_token,tokens);
        
        lv.setAdapter(adapter);
        
        
        // Evento para cuando doy click en algun elemento de la lista ( ListView )
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                    long id) {
                // Mensaje Toast del elemento seleccionado.
                Toast.makeText(getApplicationContext(), adapter.getItem(position), Toast.LENGTH_SHORT).show();
                
            }
            
        });
        
        
        /* Activando el filtro de busqueda */
        inputSearch.addTextChangedListener(new TextWatcher() {
            
            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
                
                lista_proyectos.this.adapter.getFilter().filter(arg0);
            }
            
            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub
                
            }
            
            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                
            }
        });
        
   }

}    

Ejemplo de su aplicación en funcionamiento:

listview

Mi primera lección Sobre Android

Bueno!, como les comente anteriormente y después de haber instalado todo lo necesario para empezar a programar después de muchísimos años de programar sobre PHP, MySQL, Jquery y todo lo que tenga que ver con Web bajo tecnología LAMP, entre al mundo del Android.

Aquí les dejo  mi primer script con algunas instrucciones.

Descripción del app (funcionalidad): Crear un aplicación con una imagen, con un botón y un texto, cuando damos click en el botón debe cambiar el contenido de ese texto por otro texto; Simple! vamos a la obra:

package app.cyberfuel.clase_1_ejercicio;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class PantallaInicial extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pantalla_inicial);
        // 
        Button b1 = (Button) findViewById(R.id.btn_principal);
        b1.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {

			   int duracion = Toast.LENGTH_SHORT;
		       Toast toast = Toast.makeText(getApplication(),"Dió Click en el botón", duracion);
		       toast.show();

		       TextView tv = (TextView) findViewById(R.id.mensaje_principal);
		       tv.setText("Ohh! Me diste Click");   				

			}//public void onClick(View v) {
        });// b1.setOnClickListener(new OnClickListener() {        

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.pantalla_inicial, menu);
        return true;
    }		

}

El resultado de tu aplicación debería ser algo así:

Pantalla 1 en la AVD ( Android Virtual Device):


Pantalla 2 ( Android Virtual Device):

De momento eso seria mi primera lección de Android, posiblemente complicaremos mas las cosas en las próximas lecciones que estaré recibiendo.

Gracias Profe! Julio Marín!

Como crear un Proyecto en Android

Lo que debes tener claro antes de crear un proyecto en Android, debes tener instalado el IDE (Explipse IDE for Java Developers) lo puedes descargar de la siguiente URL:

http://developer.android.com/sdk/index.html

Nos vamos nuestro programa ejecutable que tenemos en nuestro escritorio o menu, levantado el IDE, nos vamos a crear el proyecto:

Luego, nos aparece una ventana donde debemos llenar los datos del proyecto, es importante que sepas detalles como que el “Application Name” puede contener espacios, mientras que el “Project Name” no lo permite “estricto”, el package name estará asociado a un identificador único de tu aplicación, por otro lado debes seleccionar adecuadamente el SDK que vas a utilizar, pues si tu aplicación requiere de ciertos “comportamientos” o usos del dispositivo, algunas versiones “antiguas” del SDK no lo podría soportar.

A la ventana siguiente le damos unicamente click al botón de “Next”, a menos que desees cambiar la ubicación física de los archivos del proyecto, esto es el Workspace.

En esta ventana puedes adjuntar el icono de tu aplicación, colores de fondo de tu aplicacion, si lleva una imagen de background,  para efectos de este ejemplo vamos a darle next.

En esta ventana nos permite seleccionar el tipo de vista “el como se ve” que tendría la aplicación en mi dispositivo. Puedes seleccionar la otras opciones para que veas como muestra el preview, pero para efectos de nuestro ejemplo, seleccionaremos “Blank Activity” y “Next”

Por último y “MUY IMPORTANTE“, es dar un nombre correcto al nombre de tu actividad y muy relacionado al nombre de tu aplicación, se recomienda definir “un estandard” o “nomenclatura” porque cuando desarrollas apps para android y eres “vago” dando nombre incorrectos, resulta que tu aplicación o aplicaciones cuando son ejecutadas o relacionadas con los famosos “INTENTS” y las actividades al llamarse igual; tu teléfono te puede preguntar “Cual aplicación levanto” y te muestra varias, un comportamiento similar cuando quieres compartir/enviar un archivo que tu teléfono pregunta enviar por: mensaje, correo, twitter, facebook, algo como esto:

No! utilices: MainActivity

Le damos “Finish” y el resultado de tu proyecto debe ser similar a lo siguiente:

 

Ejemplo de como programar un Web service utilizando NuSOAP y PHP (Parte I)

A continuación se muestra como desarrollar un Web Service del lado del proveedor / Servidor,

1.- Incluimos la librería nusoap dentro de nuestro archivo.  lo voy a llamar “mi_ws1.php”, de manera que dentro de mi archivo mi_ws1.php voy a colocar el siguiente código:

<?php

// incluimos la libreria ó toolkit nusoap que descargamos previamente
require_once('lib/nusoap.php');

?>

2.- Creamos la instancia al servidor

<?php
// Vamos a crear la instancia del servidor.
$server = new nusoap_server();

?>

3.- Inicializamos el soporte WSDL

<?php
$server->configureWSDL('Mi Web Service #1', 'urn:mi_ws1');
?>

//urn es el “Uniform Resource Name”, es el nombre del recurso con que va a ser accesado el Web Service como lo comentamos es como el manual del WSDL

4.- Registramos la estructura de datos usado por el servicio

<?php
// Parametros de entrada
$server->wsdl->addComplexType(  'datos_persona_entrada', 
                                'complexType', 
                                'struct', 
                                'all', 
                                '',
                                array('nombre'   => array('name' => 'nombre','type' => 'xsd:string'),
                                      'email'    => array('name' => 'email','type' => 'xsd:string'),
                                      'telefono' => array('name' => 'telefono','type' => 'xsd:string'),
                                      'ano_nac'  => array('name' => 'ano_nac','type' => 'xsd:int'))
);
// Parametros de Salida
$server->wsdl->addComplexType(  'datos_persona_salidad', 
                                'complexType', 
                                'struct', 
                                'all', 
                                '',
                                array('mensaje'   => array('name' => 'mensaje','type' => 'xsd:string'))
);
?>

5.- Registramos el método/función para que el Web Service lo reconozca y se pueda utilizar:

<?php
$server->register(  'calculo_edad', // nombre del metodo o funcion
                    array('datos_persona_entrada' => 'tns:datos_persona_entrada'), // parametros de entrada
                    array('return' => 'tns:datos_persona_salidad'), // parametros de salida
                    'urn:mi_ws1', // namespace
                    'urn:hellowsdl2#calculo_edad', // soapaction debe ir asociado al nombre del metodo
                    'rpc', // style
                    'encoded', // use
                    'La siguiente funcion recibe los parametros de la persona y calcula la Edad' // documentation
);
?>

6.- Definimos el método como una función PHP

Lo que aconsejo para que tu código sea ordenado,legible es que todas tus funciones de PHP sean construidas en una unidad aparte ( miarchivo_func_soap.php) y luego realizas el include de ese archivo en tu codigo de la declaracion del servicio SOAP.

<?php
function calculo_edad($datos) {
    $edad_actual = date('Y') - $datos['ano_nac'];
    $msg = 'Hola, ' . $datos['nombre'] . '. Hemos procesado la siguiente informacion ' . $datos['email'] . ', telefono'. $datos['telefono'].' y su Edad actual es: ' . $edad_actual . '.'; 
    return array('mensaje' => $msg);
}
?>

7.- Usamos el pedido para invocar el servicio y hasta aquí llegaría el ejemplo del lado del servidor.

<?php
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>

Para probar el WS: http://www.validwsdl.com/
Escribes la dirección: http://www.mauricioalpizar.com/ejemplos/nusoap/mi_ws1.php?

Resultado:

 

Respuesta del consumo del Web Service deberia ser:

Outgoing SOAP Request

POST /ejemplos/nusoap/mi_ws1.php HTTP/1.0
Host: www.mauricioalpizar.com
Content-Type: text/xml
Content-Length: 1032
SOAPAction: "urn:hellowsdl2#calculo_edad"

<?xml version='1.0'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' xmlns:tns='urn:mi_ws1' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
   <SOAP-ENV:Body>
      <ns1:calculo_edad SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:ns1='urn:mi_ws1'>
         <datos_persona_entrada xsi:type='tns:datos_persona_entrada'>
            <nombre xsi:type='xsd:string'>
               Mauricio Alpizar
            </nombre>
            <email xsi:type='xsd:string'>
               ealpizar@cyberfuel.com
            </email>
            <telefono xsi:type='xsd:string'>
               8700-5455
            </telefono>
            <ano_nac xsi:type='xsd:int'>
               1980
            </ano_nac>
         </datos_persona_entrada>
      </ns1:calculo_edad>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Incoming SOAP Response

<?xml version='1.0' encoding='ISO-8859-1'?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' xmlns:tns='urn:mi_ws1'>
   <SOAP-ENV:Body>
      <ns1:calculo_edadResponse xmlns:ns1='urn:mi_ws1'>
         <return xsi:type='tns:datos_persona_salidad'>
            <mensaje xsi:type='xsd:string'>
               Hola, Mauricio Alpizar. Hemos procesado la siguiente informacion ealpizar@cyberfuel.com, telefono8700-5455 y su Edad actual es: 34.
            </mensaje>
         </return>
      </ns1:calculo_edadResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Si deseas ver el código para poder consumirlo aquí esta el ejemplo:

http://www.mauricioalpizar.com/ejemplo-de-como-consumir-un-web-service-utilizando-nusoap-y-php-parte-ii/

 Referencias bibliográficas:

  • http://searchsoa.techtarget.com/definition/URN