Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Consumir Webservice y pasar imagen en arreglo binario (base64)

Estas en el tema de Consumir Webservice y pasar imagen en arreglo binario (base64) en el foro de PHP en Foros del Web. ¿Alguien me podría ayudar? Estoy atorado con un sencillisimo cliente Webservice. Tengo que consumir un WS que solicita una imagen JPG de menos de 100 ...
  #1 (permalink)  
Antiguo 23/02/2014, 10:21
Avatar de Yamilskate  
Fecha de Ingreso: septiembre-2006
Mensajes: 94
Antigüedad: 17 años, 7 meses
Puntos: 0
Consumir Webservice y pasar imagen en arreglo binario (base64)

¿Alguien me podría ayudar?

Estoy atorado con un sencillisimo cliente Webservice.

Tengo que consumir un WS que solicita una imagen JPG de menos de 100 kb en formato arreglo binario (base64).

El WS es: http://201.144.89.12/recepcionImagen...esService.wsdl

Y mi cliente es así:

Código:
<?php
	/*
		Módulo de consumo WS Infonavit 2014 con imágenes
	*/
	$servicio = "http://201.144.89.12/recepcionImagenesWS/ReceptorImagenesService/WEB-INF/wsdl/ReceptorImagenesService.wsdl";
	$client = new SoapClient($servicio ,array("encoding"=>"ISO-8859-1","trace" => 1, "exceptions" => 1)  ); 

	class usuarioWSVO{
		var $idusuario = '';
		var $contrasenia = '';
		function usuarioWSVO($idusuario, $contrasenia){
			$this->idusuario = $idusuario;
			$this->contrasenia = $contrasenia;
		}
	}
	$usuario = new usuarioWSVO("USER","Prueba");

	class imagenWSVO{
		var $id_avaluo = '';
		var $id_imagen = 0;
		var $observaciones = '';
		var $pie_foto = '';
		function imagenWSVO($id_avaluo,$id_imagen,$observaciones,$pie_foto){
			$this->id_avaluo = $id_avaluo;
			$this->id_imagen = $id_imagen;
			$this->observaciones = $observaciones;
			$this->pie_foto = $pie_foto;
		}
	}
	$imagen = new imagenWSVO('28149184249022996',1,'Prueba de fachada 1','Fachada');

	// Codificar imagen en Base64
	$img_src = "ruta/imagen.jpg";
	$imgbinary = fread(fopen($img_src, "r"), filesize($img_src));  
	$base64 = base64_encode($imgbinary);
	// Realizar envío WS
	try{
		$resultado = $client->recibirImagen(array("arg0"=>$base64,"arg1"=>$usuario, "arg2"=>$imagen ));
		print_r($resultado->return->resultado);
	}
	catch (SoapFault $exception)  
	{ 
		trigger_error("SOAP Fault: (faultcode: {$exception->faultcode}, faultstring:
		{$exception->faultstring})");

		var_dump($exception);  
	}	
?>
Obtengo una excepción SoapFault: looks like we got no XML document

Solicito ayuda por que ya llevo atorado una semana entera y no he podido resolverlo.

Espero me puedan ayudar, gracias.

P.D. El WS servidor es de otra compañía por lo que no podría modificarlo, pienso que el problema esta más bien en mi cliente WS.
  #2 (permalink)  
Antiguo 23/02/2014, 14:18
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Consumir Webservice y pasar imagen en arreglo binario (base64)

agregar:
Código PHP:
Ver original
  1. echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
  2. echo "Respuesta:\n" . $client->__getLastResponse() . "\n";
en el bloque catch te ayudara a deducir cual es el error.

El fallo es que el xml es invalido, pero solo mirandolo podras saber en donde falla.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 24/02/2014, 17:07
Avatar de Yamilskate  
Fecha de Ingreso: septiembre-2006
Mensajes: 94
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Consumir Webservice y pasar imagen en arreglo binario (base64)

Gracias de antemano amigo, no conocía esa técnica de los magics para obtener esos errores, me devolvió lo siguiente:

Código:
Respuesta: --MIMEBoundaryurn_uuid_7786DE810A1F6395B21393282726234 Content-Type: application/xop+xml; charset=utf-8; type="text/xml" Content-Transfer-Encoding: binary Content-ID: <0.urn:uuid:[email protected]> 2014/02/24 16:58:32ErrorError en el contenido de la imagen --MIMEBoundaryurn_uuid_7786DE810A1F6395B21393282726234--
No estoy seguro de que signifique pero imagino que puede ser la codificación de la imagen... ¿?
  #4 (permalink)  
Antiguo 25/02/2014, 10:50
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Consumir Webservice y pasar imagen en arreglo binario (base64)

Cita:
Código:
Respuesta: --MIMEBoundaryurn_uuid_7786DE810A1F6395B213932827262 34
Content-Type: application/xop+xml;
charset=utf-8;
type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <0.urn:uuid:7786DE810A1F6395B21393282726235@apache .org> 2014/02/24 16:58:32
Error: Error en el contenido de la imagen --MIMEBoundaryurn_uuid_7786DE810A1F6395B213932827262 34--
Esa es la respuesta del webservice, el error es claro y hasta esta en español, tendrias que verificar contra la documentacion del ws que formato de parametros espera, y compararlo contra el:
Código PHP:
Ver original
  1. var_dump(array("arg0"=>$base64,"arg1"=>$usuario, "arg2"=>$imagen ));
a ver que es lo que esta mal y porque esta dando error
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #5 (permalink)  
Antiguo 25/02/2014, 14:39
Avatar de Yamilskate  
Fecha de Ingreso: septiembre-2006
Mensajes: 94
Antigüedad: 17 años, 7 meses
Puntos: 0
De acuerdo Respuesta: Consumir Webservice y pasar imagen en arreglo binario (base64)

Muchas gracias, encontré la solución la cuál muestro a continuación por si a alguien le puedo ayudar.

Tuve que brindar soporte a MTOM a la función nativa SoapClient de PHP con el siguiente código:

Código PHP:
class MySoapClient extends SoapClient
    {
        public function __doRequest($request, $location, $action, $version, $one_way = 0)
        {
            $response = parent::__doRequest($request, $location, $action, $version, $one_way);
            // parse $response, extract the multipart messages and so on
            
            //this part removes stuff
            $start=strpos($response,'<?xml');
            $end=strrpos($response,'
>);    
            
$response_string=substr($response,$start,$end-$start+1);
            return(
$response_string);
        }
    }
Y la imagen solo hacía falta enviarla leyendola con file_get_contents() sin necesidad de aplicarle base64_encode();

Gracias a todos por su ayuda.

¡Saludos!

Etiquetas: arreglo, binario, consumir, webservice
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 04:45.