Creando un servidor NuSOAP en CodeIgniter

Publicado: 04/12/2009 en CodeIgniter, desarrollo, nusoap, php, Programación, Servidor
Etiquetas:, , , ,

You can read the English version of this post in http://phpsblog.agustinvillalba.com/creating-a-soap-server-in-codeigniter/

Tal y como nos pedía nuestro amigo Enrique, y porque creo que no será el único que pueda tener esta duda, hoy voy a hablar sobre cómo crear un servidor de servicios web con NuSOAP en CodeIgniter. Para ello partiré de la base que establecimos en el post anterior (Utilizando NuSOAP en CodeIgniter), por lo que les recomiendo leer ese post antes de continuar con este, dado que aquí utilizaremos la “pseudo” librería nuSoap_lib que creamos anteriormente.

Creando nuestro servidor NuSOAP

Nuestro servidor NuSOAP en CodeIgniter será un controlador el cual no necesitará tener su vista correspondiente, dado que únicamente será accedido para realizar ciertas tareas (incluso interactuar con modelos si fuera necesario) y devolver sus resultados vía web a su cliente remoto, por lo que en ningún momento será necesario mostrar dichos datos en pantalla en el servidor.

Bien, después de aclarar este punto, pasamos a crear nuestro controlador servidor en CodeIgniter, para ello creamos el archivo “servidorNuSoap.php” dentro del directorio “system/application/controller” en el cual insertamos el siguiente código:

class ServidorNuSoap extends Controller {
 function __construct() {
 parent::Controller();

 $this->load->library("nuSoap_lib");

 $this->nusoap_server = new soap_server();
 $this->nusoap_server->configureWSDL("MiembroWSDL", "urn:MiembroWSDL");

 $this->nusoap_server->wsdl->addComplexType(
 "Miembro",
 "complexType",
 "array",
 "",
 "SOAP-ENC:Array",
 array(
 "id"=>array("name"=>"id", "type"=>"xsd:int"),
 "nombre"=>array("name"=>"nombre", "type"=>"xsd:string"),
 "apellido"=>array("name"=>"apellido", "type"=>"xsd:string")
 )
 );    

 $this->nusoap_server->register(
 "obtenerMiembro",
 array(
 "id" => "xsd:int",
 ),
 array("return"=>"tns:Miembro"),
 "urn:MiembroWSDL",
 "urn:MiembroWSDL#obtenerMiembro",
 "rpc",
 "encoded",
 "Obtiene la información de un miembro especificado"
 );
 }

 function index() {
 if($this->uri->segment(3) == "wsdl") {
 $_SERVER['QUERY_STRING'] = "wsdl";
 } else {
 $_SERVER['QUERY_STRING'] = "";
 }

 $this->nusoap_server->service(file_get_contents("php://input"));
 }

 function obtener_miembro() {
 function obtenerMiembro($idMiembro) {
 $CI =& get_instance();

 $CI->load->model("Miembro");

 $row = $CI->Miembro->obtenerMiembro($idMiembro);

 return $row;
 }

 $this->nusoap_server->service(file_get_contents("php://input"));
 }
}

Todo esto está muy bien, pero… ¿qué significa todo esto? Bueno, paso a explicar paso a paso qué es y para qué sirve cada cosa. En la funcion “$this->nusoap_server->wsdl->addComplexType” tenemos varios campos:

  1. Nombre. Este será en nombre que le daremos al tipo.
  2. typeClass. Es el tipo propio NuSOAP que compondrá nuestro tipo (los más habituales son complexType o simpleType)
  3. phpType. Es el tipo propio de PHP al cual pertenecerá la estructura que devolverá nuestro servicio (actualmente los soportados son array y struct)
  4. compositor. Este campo indica cómo los subelementos de nuestra estructura funcionan, es decir, son todos elementos opcionales siendo incluidos en cualquier orden (valor “all”), o son opcionales pero en el orden establecido (valor “sequence”) o bien, sólo uno de ellos está permitido cada vez (valor “choice”).
  5. restrictionBase. Esto le indica al sistema que nuestro tipo complejo se basa en el tipo Array definido en soap-encoding namespace.
  6. Por último, definimos los campos que tendrá nuestro campo complejo y de qué tipos serán esos campos.

Una vez hemos definido el tipo que vamos a utilizar, en la función “$this->nusoap_server->register” creamos el método que podrá ser llamado desde cualquier cliente externo. En él establecemos:

  1. El nombre del método
  2. Los parámetros de entrada que necesita nuestro método
  3. El tipo de los parámetros de salida que devolverá nuestro método
  4. Espacios de nombres del método
  5. Acción a realizar dentro del espacio de nombre (el mismo nombre del método)
  6. Estilo
  7. Uso
  8. Información sobre el método

Con esto ya tenemos casi listo nuestro servidor de servicios web NuSOAP. Sólo nos falta un detalle de configuración. En el archivo “system/application/config/routes.php” hemos de añadir la siguiente ruta:

$route['ServidorNuSoap/obtieneMiembro/wsdl'] = 'ServidorNuSoap/index/wsdl';

Dado que es imprescindible establecer la ruta correcta a nuestro servicio NuSOAP.

Con esto ya tenemos creado y listo para empezar a ofrecer servicios a nuestro flamante servidor NuSOAP integrado en nuestro framework de desarrollo CodeIgniter.

You can read the English version of this post in http://phpsblog.agustinvillalba.com/creating-a-soap-server-in-codeigniter/

Anuncios
comentarios
  1. Daniel Molina dice:

    Pregunta, como se puede adaptar esto para que funcione con coreignither 2?

  2. Javier dice:

    Hola q tal,, tengo un inconveniente… mira, probando tu ejemplo el WSDL me generá Endpoint: http://localhost/zigb/index.php, esa ruta no es la del servicio; la ruta del WSDL generada es http://localhost/zigb/index.php?wsdl … que tampoco existe, Gracias de antemano por tu respuesta

    • Si quieres déjame ver tu código, para poder saber dónde puede estar el error. Saludos.

      • Angel dice:

        Hola Agustin, te escribo para ver si me puedes ayudar con un problema que tengo con mi proyecto. Tengo que definir un método en mi web service que reciba como dato complejo la siguiente estructura

        String
        Entero

        String
        Entero

        Y como respuesta el siguiente dato complejo:

        String
        String

        String
        String

        Como puedes ver, se repite el dato complejo Estancias, pero tiene distinta estructura, es decir, una es un array de Estancia y la otra es un array de Destino. ¿Cómo puedo declarar este tipo complejo en mi webservice cuando tienen el mismo nombre y distinta estructura? ¿Habria que crear distinto espacio de nombres? si es asi, ¿como se hace?

        Muchas gracias

  3. quiquedcode dice:

    Muy bueno Agustin !! y muy rapido !!
    Muchisimas gracias por la data…

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s