Espero que puedan responder a la brevedad necesito la mayor cantidad de ayuda que se pueda brindar,
estoy haciendo web service con soap (requerimiento del usuario) que necesita conectarse a una aplicación externa. Si dispusieran de mayor información ya que he encontrado muy poca sobre este tema.
Lo que tengo hasta el momento en el module es
function sverein_sync_menu() {
$items = array();
$items['sverein/services/soap'] = array(
'title' => 'SOAP Server',
'page callback' => 'sverein_sync_server',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
function sverein_sync_server() {
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer('http://localhost/drupal2/sites/all/modules/sverein-1.x-1.0/sverein/SVereinSync.wsdl');
$server->setClass('SVereinSync');
$server->handle();
}
que por un tema de la empresa no puedo mostrar. por el momento estoy realizando pruebas en mi localhost la clase la tengo incluida en el mismo module.
En si el modulo me realizara una sincronización entre drupal y otra aplicación. Si conocieran del tema les agradeceria la ayuda.
Comments
Modulo Services
Estimado, yo tengo poca experiencia en el asunto, pero de lo poco que he experimentado use el módulo services, gracias a su api pude realizar un services rapidamente con el XMLRPC (También incluye el SOAP).
Este incluye algunos callbacks para mantener un nodo, de hecho la prueba que hice fue modificar un nodo de un drupal desde otro.
Te recomiendo que lo mires, quizas te ayude mucho.
Saludos
Service
Muchas gracias por tu rapido post bueno en si ya he probado con el modulo service y no he tenido exito en su uso. si fueras amable de publicar un ejemplo te lo agradecería.
Ejemplo, pero con XMLRPC
Este ejemplo usa el módulo Services y como servidor el XMLRPC, en tu caso debería ser el SOAP.
Vamos a crear un servicio que recibe un número y lo retorna multiplicado x 2, si no recibe un número, entonces lo dice: 'No es número'. Pero no cualquiera podría usar el metodo, por lo que crearemos una key para que solo una plataforma pueda usarlo.
Para ello creamos un módulo propio, donde lo vamos a llamar "mi_servicio"
mi_servicio.module
<?php
/<em>
* Implementando hook_perm
*/
function mi_servicio_perm() {
return array(
'usar mi servicio',
);
}
/</em>
*Implementando hook_service
*/
function mi_servicio_service(){
return array(
array(
'#method' => 'mi_servicio.get',
'#callback' => 'mi_servicio_get',
'#access callback' => 'mi_servicio_get_access',
'#file' => array('file' => 'inc', 'module' => 'mi_servicio'),
'#args' => array(
array(
'#name' => 'numero',
'#type' => 'int',
'#description' => t('Ingresar solo un número')),
),
'#return' => 'struct',
'#help' => t('Retorna el número multiplicado x 2')),
);
}
?>
El archivo .module solo tiene estas 2 funciones, el primero asigna el permiso que le vamos a dar al rol anónimo, para darle acceso al metodo desde afuera (de un programa u otra página web), y el hook_services retorna un arreglo con la información de nuestro metodo, así el módulo services lo detecta y lo agrega en su lista.
Ahora el archivo mi_servicio.inc
<?php
function mi_servicio_get($numero) {
if(!is_numeric($numero)){
$result->resultado = 'No es número';
}else{
$result->resultado = 'Resultado de '.$numero.'x2 : '.$numero*2;
}
return $result;
}
function mi_servicio_get_access(){
if(user_access('usar mi servicio'))return TRUE;
return FALSE;
}
?>
Aquí esta la función que retornará el resultado por services a la entidad que lo solicitó. La segunda función es por el permiso.
Y listo, tienes el módulo con el nuevo método, ahora lo que tienes que hacer es configurar el módulo Services:
1) vas a admin/build/services/settings y en Authentication module escojes Key Authentication, y dejas marcado los checkboxs Use keys y Use sessid (Así no cualquiera puede usar el método).
2) Tienes que crear la llave, en admin/build/services/keys, hay le asignas cualquier título y en el dominio colocas la dirección de la plataforma que usará el servicio, por ejemplo otro Drupal cuya dirección podría ser localhost/otro_drupal o la IP/otro_drupal, te generará una llave, el que tendras que usar en la otra plataforma.
Ya con eso podrías intentar conectarte. En el otro drupal podrías pegar este código:
<?php
global $base_url;
$apikey = '<LA LLAVE>';
$numero = '<Numero a multiplicar>';
//Eliminamos de $base_url el "http://"
$domain = preg_replace('/http:\/\//', '', $base_url);
$url_to_connect = 'http://MIPAGINADRUPAL/services/xmlrpc';
$timestamp = (string) time();
$nonce = user_password();
$hash = hash_hmac('sha256', $timestamp .';'.$domain .';'. $nonce .';'.'system.connect', $apikey);
$xmlrpc_result = xmlrpc($url_to_connect, 'system.connect');
$sid = $xmlrpc_result['sessid'];
$timestamp = (string) time();
$hash = hash_hmac('sha256', $timestamp .';'.$domain .';'. $nonce .';'.'mi_servicio.get', $apikey);
$xmlrpc_result = xmlrpc($url_to_connect, 'mi_servicio.get', $hash, $domain, $timestamp, $nonce, $sid, $numero, array());
if ($xmlrpc_result === FALSE) {
$error = xmlrpc_error();
drupal_set_message('Error de Solicitud: '.$error->message, 'error');
return FALSE;
}
else {
return $xmlrpc_result;
}
?>
Este código lo copie de otra parte que no logro encontrarlo, pero esto es solo para xmlrpc. El resultado $xmlrpc_result es un arreglo, para este caso solo trae un elemento: "resultado", así imprimo $xmlrpc_result['resultado'].
Ojalas te sirva de base, si aún tienes dudas, pregunta nomás.
Saludos
EDIT: De aquí aprendí a usar el módulo y use su ejemplo como base.
Service Soap
Gracias por tu ayuda, disculpa el no haber contestado antes pero ya he logrado realizar un web service soap en drupal. De antemano muchas gracias.
Agradecería un ejemplo web service soap implementado.
Hola Daniel,
Podrías ayudarnos con un ejemplo del web service soap que lograste implementar.
Saludos desde Costa Rica.
Oscar Duran
web service soap
el module lo he implementado de la siguiente manera:
<?php
/<strong>
* Implement hook_menu().
*/
function sverein_sync_menu() {
$items = array();
$items['sverein/services/soap'] = array(
'title' => 'SOAP Server',
'page callback' => 'sverein_sync_server',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
/</strong>
* Implement hook_server.
*/
function sverein_sync_server() {
include_once( DRUPAL_ROOT . '/' . drupal_get_path('module', 'sverein') . '/classes/SVerein_sync.inc' );
$url = url( drupal_get_path('module', 'sverein') . '/SVereinSync.wsdl.php', array('absolute' => TRUE) );
$server = new SoapServer($url);
$server->addFunction('newuser');
$server->addFunction('deleteuser');
$server->addFunction('disableuser');
$server->addFunction('changeuser');
$server->handle();
return TRUE;
}
?>
El archivo SVerein_sync.inc contiene especificada cada uno de los servicios que posee el web service.
Y el archivo SVereinSync.wsdl.php contiene el wsdl a generar. Espero que te sirva de ayuda.
Gracias por la respuesta...
Creo que debo estudiar un poco más el asunto, sin embargo, gracias por la respuesta de todas formas.
Oscar Duran