Foros del Web » Programando para Internet » PHP »

Forzar response tipo XML en WS nusoap

Estas en el tema de Forzar response tipo XML en WS nusoap en el foro de PHP en Foros del Web. Hola a todos, he buscado muchisimo en internet y no encuentro solucion alguna y ya no tengo mas ideas a respecto el problema es el ...
  #1 (permalink)  
Antiguo 11/09/2012, 07:11
 
Fecha de Ingreso: enero-2010
Ubicación: Barcelona, España
Mensajes: 57
Antigüedad: 14 años, 3 meses
Puntos: 3
Pregunta Forzar response tipo XML en WS nusoap

Hola a todos, he buscado muchisimo en internet y no encuentro solucion alguna y ya no tengo mas ideas a respecto el problema es el siguiente:
he implementado un WS con NuSoap y cuando lo trato de consumir con un cliente nusoap tambien todo funciona bien pero cuando tratan de consumirlo x ejemplo desde .net reciben el siguiente mensaje:

El cliente encontró un tipo de contenido de respuesta de ' text/html, pero se esperaba 'text/xml'.

he leido que puede ser un error que devuelva el WS pero es que no logro visualizar ese error, mi pregunta es :
Como puedo forzar al ws a que la salida sea siempre un XML, aqui les dejo el codigo por si alguien me puede ayudar un poco, de verdad lo necesito muchisimo pues ya no se que otra cosa hacer!
Server:
Código PHP:
<?php
require_once 'lib/nusoap.php';
$ns "http://www.namespace.com/";
$server = new soap_server();

$server->configureWSDL('SociosRegistrados',$ns);
$server->wsdl->schemaTargetNamespace $ns;
$server->soap_defencoding 'UTF-8'
$server->register('WmSocioRegistradoInsertar',array('xmlstr' => 'xsd:string'),array('return' => 'xsd:string'),$ns);
$server->register('WmSocioRegistradoActualizar',array('xmlstr' => 'xsd:string'),array('return' => 'xsd:string'),$ns);
function 
WmSocioRegistradoInsertar($xmlstr){    
    
$error 0;
    
$totalInsertados 0;
    
$xml = @simplexml_load_string($xmlstr);
    foreach (
$xml->oWmSocioRegistradoInsertarIn as $cliente){        
        
$sUsuarioWS trim($cliente->sUsuarioWS);
        
$sPassWS trim($cliente->sPassWS);      
        
$sUsername trim($cliente->sUsername);
        
$sPassword trim($cliente->sPassword);
        
$sNombre trim($cliente->sNombre);
        
$sLicencia trim($cliente->sLicencia);
        
$sSexo trim($cliente->sSexo);
        
$dFechaNac trim($cliente->dFechaNac);
        
$sMovil trim($cliente->sMovil);
        
$sEmailtrim($cliente->sEmail);
        
$iSocioRegistradoTipoPermiso trim((int)$cliente->iSocioRegistradoTipoPermiso);      

        if ((
$sUsername != "")
            && (
$iSocioRegistradoTipoPermiso != "")
            && (
$iSocioRegistradoTipoPermiso != 0)
            && (
is_numeric($iSocioRegistradoTipoPermiso))){     
                if (!
encontrando($sUsername)){
                    if(
insertando($sUsuarioWS,$sPassWS,$sUsername,$sPassword,$sNombre,$sLicencia,$sSexo,$dFechaNac,$sMovil,$sEmail,$iSocioRegistradoTipoPermiso))
                       
$totalInsertados++;                          
                }
            }else{
                
$error 1;
            }
            
        }
        if (
$error == 1){
            
$error_msj "Ha dejado campos obligatorios vac&iacute;os &oacute; con errores!<br />";
            
$salida .= "Se han insertado (".$totalInsertados.") registros.";
        }else{
            
$salida "Se han insertado (".$totalInsertados.") registros.";
    }
    
$contenido '<?xml version="1.0" encoding="UTF-8"?>';
    
$contenido .= '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">';
    
$contenido .= '<soap:Body><WmSocioRegistradoInsertarResponse xmlns="http://www.golfspain.com/">';
    
$contenido .= '<WmSocioRegistradoInsertarResult>';
    
$contenido .= '<oError>';
    
$contenido .= '<iError>1</iError><sMensaje></sMensaje>';
    
$contenido .= '</oError>';
    
$contenido .= '<oResp>';
    if(
$error == 0){
        
$contenido .= '<iResp>1</iResp><sMensaje>Correcto</sMensaje>';    
    }else{
        
$contenido .= '<iResp>1</iResp><sMensaje>'.$error_msj.'</sMensaje>';             
    }    
    
$contenido .= '</oResp>';
    
$contenido .= '</WmSocioRegistradoInsertarResult>';
    
$contenido .= '</WmSocioRegistradoInsertarResponse>';
    
$contenido .= '</soap:Body></soap:Envelope>';     

    return new 
soapval('return''xsd:string'htmlspecialchars($contenido));
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA '';
$server->service($HTTP_RAW_POST_DATA);
?>
lo ke devuelve:
string(720) "<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><WmSocioRegistradoInsertarRe sponse xmlns="http://www.namespace.com/"><WmSocioRegistradoInsertarResult><oError><iError >1</iError><sMensaje></sMensaje></oError><oResp><iResp>1</iResp><sMensaje>Correcto</sMensaje></oResp></WmSocioRegistradoInsertarResult></WmSocioRegistradoInsertarResponse></soap:Body></soap:Envelope>"
un millon de gracias de antemano
saludos
  #2 (permalink)  
Antiguo 11/09/2012, 10:10
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Forzar response tipo XML en WS nusoap

Puedes usar header('Content-type: text/xml') para forzar que sea un XML.
  #3 (permalink)  
Antiguo 11/09/2012, 11:19
 
Fecha de Ingreso: enero-2010
Ubicación: Barcelona, España
Mensajes: 57
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Forzar response tipo XML en WS nusoap

Hola , muchas gracias por tu respuesta , mira , ahora he logrado que la respuesta como la que necesito pero me surge otro problema:
la funcion:
Código PHP:
simplexml_load_string($xmlstr
funciona cuando el xml de entrada no tiene la etiqueta <soap:Body></soap:Body>
pero cuando viene esa etiqueta pues simplemente no me parsea el xml y simplemente me quedo sin valores! tienes idea de por que puede estar pasando esto? esta seria la entrada que debo procesar y que no me funciona por esta etiqueta:
Código PHP:
$xmlstr = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<WmSocioRegistradoInsertar xmlns="http://www.namespace.com/">
<oWmSocioRegistradoInsertarIn>
<sUsuarioWS>master</sUsuarioWS>
<sPassWS>masterpass</sPassWS>
<sUsername>13303303</sUsername>
<sPassword>15FEJNHW</sPassword>
<sNombre>Minombre</sNombre>
<sLicencia>1111111111</sLicencia>
<sSexo>M</sSexo>
<dFechaNac>1969-06-23</dFechaNac>
<sMovil></sMovil>
<sEmail></sEmail>
<iSocioRegistradoTipoPermiso>2</iSocioRegistradoTipoPermiso>
</oWmSocioRegistradoInsertarIn>
</WmSocioRegistradoInsertar>
</soap:Body></soap:Envelope>
XML;
muchas gracias nuevamente!
un saludo
  #4 (permalink)  
Antiguo 11/09/2012, 15:55
 
Fecha de Ingreso: enero-2010
Ubicación: Barcelona, España
Mensajes: 57
Antigüedad: 14 años, 3 meses
Puntos: 3
Respuesta: Forzar response tipo XML en WS nusoap

Ya lo he resuelto, despues de mucho pelo perdido aki les dejo el codigo por si a alguien le hace falta, el tema es que cuando trabajamos con SOAP necesitamos registrar los namespace para poder acceder a los elementos asi ke el codigo me quedo de la siguiente forma:
Código PHP:
Ver original
  1. function WmSocioRegistradoInsertar($xmlstr){    
  2.     $error = 0;
  3.     $totalInsertados = 0;
  4.     $xml = @simplexml_load_string($xmlstr);
  5.     $xml->registerXPathNamespace('ns', 'http://www.namespace.com/');    
  6.     if($xml->xpath('//ns:oWmSocioRegistradoInsertarIn')){
  7.         foreach ($xml->children('http://schemas.xmlsoap.org/soap/envelope/')->children('http://www.namespace.com/')->WmSocioRegistradoInsertar->oWmSocioRegistradoInsertarIn as $cliente){        
  8.             $sUsuarioWS = trim($cliente->sUsuarioWS);
  9.             $sPassWS = trim($cliente->sPassWS);      
  10.             $sUsername = trim($cliente->sUsername);
  11.             $sPassword = trim($cliente->sPassword);
  12.             $sNombre = trim($cliente->sNombre);
  13.             $sLicencia = trim($cliente->sLicencia);
  14.             $sSexo = trim($cliente->sSexo);
  15.             $dFechaNac = trim($cliente->dFechaNac);
  16.             $sMovil = trim($cliente->sMovil);
  17.             $sEmail= trim($cliente->sEmail);
  18.             $iSocioRegistradoTipoPermiso = trim((int)$cliente->iSocioRegistradoTipoPermiso);      
  19.             if (($sUsername != "")
  20.                 && ($iSocioRegistradoTipoPermiso != "")
  21.                 && ($iSocioRegistradoTipoPermiso != 0)
  22.                 && (is_numeric($iSocioRegistradoTipoPermiso))){    
  23.                     if (!encontrando($sUsername)){
  24.                         if(insertando($sUsuarioWS,$sPassWS,$sUsername,$sPassword,$sNombre,$sLicencia,$sSexo,$dFechaNac,$sMovil,$sEmail,$iSocioRegistradoTipoPermiso))
  25.                            $totalInsertados++;                                            
  26.                     }
  27.                 }else{
  28.                     $error = 1;
  29.                 }
  30.                
  31.         }            
  32.     }else{
  33.         $error = 2;        
  34.     }
  35.     if ($error == 1){
  36.         $error_msj = "Ha dejado campos obligatorios vac&iacute;os &oacute; con errores!<br />";
  37.         $salida .= "Se han insertado (".$totalInsertados.") registros.";
  38.     }elseif($error == 2){
  39.         $error_msj = html_entity_decode("No se ha encontrado el contenedor <oWmSocioRegistradoInsertarIn></oWmSocioRegistradoInsertarIn> en su entrada");
  40.         $salida = "Se han insertado (".$totalInsertados.") registros.";
  41.     }else{
  42.         $salida = "Se han insertado (".$totalInsertados.") registros.";
  43.     }
  44.     $contenido = '<?xml version="1.0" encoding="UTF-8"?>';
  45.     $contenido .= '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">';
  46.     $contenido .= '<soap:Body><WmSocioRegistradoInsertarResponse xmlns="http://www.namespace.com/">';
  47.     $contenido .= '<WmSocioRegistradoInsertarResult>';
  48.     $contenido .= '<oError>';
  49.     $contenido .= '<iError>1</iError><sMensaje></sMensaje>';
  50.     $contenido .= '</oError>';
  51.     $contenido .= '<oResp>';
  52.     if($error == 0){
  53.         $contenido .= '<iResp>1</iResp><sMensaje>Correcto</sMensaje>';    
  54.     }else{
  55.         $contenido .= '<iResp>1</iResp><sMensaje>'.$error_msj.'</sMensaje>';            
  56.     }    
  57.     $contenido .= '</oResp>';
  58.     $contenido .= '</WmSocioRegistradoInsertarResult>';
  59.     $contenido .= '</WmSocioRegistradoInsertarResponse>';
  60.     $contenido .= '</soap:Body></soap:Envelope>';    
  61.     return new soapval('return', 'xsd:string', $contenido);
  62. }
un saludo

Etiquetas: html, nusoap, registro, response, tipo, xml, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:52.