entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

LEER un web service asmx en PHP

hola

soy NOVATO en php pero he consultado por google y hacer esto se ve facil... pero... me sale erro el la linea donde deseo imprimir o mostrar el resultado, lo que recibe es un objeto pero como hago para transformarlo en array y recorrerlo y mostrar cada uno de los campos???

  <?php
     require_once('../lib/lib/nusoap.php');
     $AsmxWebService="http://190.248.128.170/webservXXXX/serviciowebXX.asmx?  
      wsdl";

     $opciones = array(); 

      $WS = new SoapClient($AsmxWebService, $opciones);

     //recibimos la respuesta dentro de un objeto 
     $result = $WS->ExportarOrdenesCompra();
     //Mostramos el resultado de la consulta 
      echo $result->HelloWorldResult;
  ?>

me falta castear $result o $WS->... ??

En caso de convertir el objeto como recorro cada item del array? o puedo recorrer el objeto? me imagino que debo de llevar el objeto a una clase?

1 Respuesta

1voto

Leonardo-Tadei Puntos203350

Hola @german,

el webservices debería devolverte una estructura plana o con forma de árbol, pero nuenca nada a lo que le puedas ejecutar un método como insinuás en $result = $WS->ExportarOrdenesCompra();

Para fer la estructura de la respuesta, podés hacer un var_dump($WS) para ver qué tiene adentro.

Seguramente la estructura es de tipo traversable, así que también podrías usar un foreach para recorrer y mostrar el contenido.

Si saber la estructura d ela respuesta del WebService, no se pueden dar muchos detalles, pero si copiás y pegás acá la salida del var_dump($WS) seguro que podremos avanzar.

Saludos

german comentado Jul 1, 2016

hola leonardo gracias por tu respuesta realmente hice un json_encode a la variable $result y luego le hice el print_r($result)

este es el resultado

string(15312351) "{"schema":"<\/xs:sequence><\/xs:complexType><\/xs:element><\/xs:choice><\/xs:complexType><\/xs:element><\/xs:schema>","any":"001<\/f420_id_co>OCN<\/Documento>38775<\/NumDocto>401<\/Concepto>20160520<\/Fecha>402<\/f420_id_grupo_clase_docto>404<\/f420_id_clase_docto>1<\/Estado>0<\/f420_ind_impresion>43606974 <\/f451_id_tercero_comprador>890923384<\/nitProveedor>001<\/f451_id_sucursal_prov>004<\/CondicionPago>1<\/IndicadorTasa>COP<\/MonedaDocto>COP<\/MonedaConv>1.0000<\/TasaConv>COP<\/f451_id_moneda_local>1.0000<\/TasaLocal>0.0000<\/f451_tasa_dscto_global1>0.0000<\/f451_tasa_dscto_global2>LUIS FELIPE TRUJILLO CADAVID<\/f419_contacto>CL 79 SUR # 52A 245 (LA ESTRELLA-ANT)<\/f419_direccion1>169<\/f419_id_pais>05<\/f419_id_depto>001<\/f419_id_ciudad>LA ESTRELLA<\/f419_id_barrio>339 99 99<\/f419_telefono>REIMPRESION SC.<\/f420_num_docto_referencia>0<\/f451_ind_consignacion>RECEP<\/f470_id_bodega>01<\/f421_id_motivo>0<\/f421_ind_obsequio>001<\/f421_id_co_movto>RES <\/UnidadMedida>1920.0000<\/CantComp>20160609<\/fecha_entrega>0<\/f421_cod_item_prov>10050.0000<\/PrecioUnitario>0<\/f421_notas>0<\/f421_detalle>63340 <\/Codigo>0<\/CodigoBarras>1<\/f421_id_un_movto>0.0000<\/f421_tasa_dscto_condicionado>1.0000<\/FactorConv>39407<\/f420_rowid>0<\/f470_id_causal_devol>0<\/f470_vlr_bruto>24537<\/f120_rowid>0<\/CantidadRealRecibida>0<\/CantidadxNovedad><\/Table>
001<\/f420_id

Leonardo-Tadei comentado Jul 2, 2016

Hola @german,

no tiene sentido hacer un json_encode(). En el caso de que la respuesta del WS sea en formato JSON (y en este caso no lo es) tendrías que hacer un json_decode().

Lo que el WS te está devolviendo es un string en formato XML.

Se supone que la estructura del XML es siempre la misma para cada WS, por lo que podrías fácilmente leer toda la respuesta o buscar algún dato en un nodo con la clase standard de PHP SimpleXML

Saludos cordiales

german comentado Jul 5, 2016

hola @Leonardo-Tadei
Lo que el WS te está devolviendo es un string en formato XML. NO!! no devuelve un string devuelve un objeto, al realizar

 $resultXml = simplexml_load_string($xml);
     var_dump($resultXml);

sale el siguiente error
"E_WARNING : type 2 -- simplexml_load_string() expects parameter 1 to be string, object given -- at line 17"
NULL

igual use el simplexml_load_file()
ERROR simplexml_load_file() expects parameter 1 to be a valid path, object given

Y LO Que quiero hacer es que se vuelva un json
porque si lo llamo o recorro como un objeto me trae todo los datos sin definirme cada campo o elemento
del XML asi

foreach ($xml as $clave => $valor) {
echo "Clave: $clave; Valor: $valor<br>";
}
RESULTADO:
Clave: any; Valor: 001OCN38775401201605204024041043606974 8909233840010041COPCOP1.0000COP1.00000.00000.0000LUIS FELIPE TRUJILLO CADAVIDCL 79 SUR # 52A 245 (LA ESTRELLA-ANT)16905001LA ESTRELLA339 99 99REIMPRESION SC.0RECEP010001RES 1920.000020160609010050.00000063340 010.00001.000039407002453700

y quiero que se defina asi:
001<\/f420_id_co>
OCN<\/Documento>

Leonardo-Tadei comentado Jul 5, 2016

Hola @german,

perdona, pero hay algo de background que no estás comprendiendo: un WebService funciona sobre HTTP, que es un protocolo que transmite solo texto. La única salvedad es que recibas un binario (ej: una imagen) en cuyo caso deberá codificarse primero como texto para ser transmitida. Siempre es texto y texto=string en PHP.

Esto significa que lo que recibís del WS tiene que ser texto... si nos mostrás la porción de código en dónde creás la variable $xml podremos ayudarte mejor. Es seguramente ahí en dóinde definís $xml como algún tipo de Objeto de PHP y por eso tenés ese error.

Si ese Objeto de PHP encapsula una comunicación con el WS, debe tener algún atributo que tenga el string con el contenido de la respuesta. USá eso y podrás tratarlo como XML, que es el formato que se ve que tiene la respuesta según pones en tu pregunta.

Luego, si querés convertir la respuesta en un JSON con la función json_encode() le tenés que dar un array en que cada elemento tenga uno de los valores, y no un único elemento con todo junto.

Resumiento, tenés que hacer 3 cosas: obtener la respuesta, convertir el XML a un vector; codificar el vector como JSON.

Saludos cordiales.

german comentado Jul 5, 2016

hola @Leonardo-Tadei el codigo que utilice en la ultima respuesta fue este

   <?php

   // Llamada al WebService
    $client = new SoapClient("http://190.xxx.128.170/webservicexxxx 
         /servicioxxxx.asmx?WSDL");
    $result = $client->ExportarOrdenesCompra();
    $xml = $result->ExportarOrdenesCompraResult;

    $ordenesCompra = json_encode($xml);
    // aca describes que se realice un json_decode()...
    $ordenesCompra = json_encode($xml);
    // esta linea lo convierto a un simplexml
    $resultXml = simplexml_load_string($xml);
     var_dump($resultXml);

Luego, si querés convertir la respuesta en un JSON con la función json_encode() le tenés que dar un array en que cada elemento tenga uno de los valores, y no un único elemento con todo junto.

Si, pero como convierto a array? no he podido recorrer cada uno de los item con el XML por que como te explique en la otra respuesta no me sale los nombres de los Element de xml

   foreach ($xml as $clave => $valor) {
     echo "Clave: $clave; Valor: $valor<br>";
   }
RESULTADO:
   Clave: any; Valor: 001OCN38775401201605204024041043606974  
   8909233840010041COPCOP1.0000COP1.00000.00000.0000LUIS FELIPE TRUJILLO  
   CADAVIDCL xx SUR # xxA xx5 (xx xxx-ANT)16905001LA ESTRxxxx339 99 99REIMPRESION SC.0RECEP010001RES 1920.000020160609010050.00000063340 010.00001.000039407002453700

Leonardo-Tadei comentado Jul 6, 2016

Hola @german,

Según se ve en tu último código, la variable $client es un SoapClient.

Cuál es el código del método $client->ExportarOrdenesCompra() ???

Pareciera que estás asumiendo un comportamiento y estás obteniendo otra cosa...

Luego, hacés $ordenesCompra = json_encode($xml); lo que no tiene sentido, porque esa función necesita un array como parámetro para que haga lo que vos necesitás, y si en la variable $xml hubiera realmente contenido XML, este sería un largo string con etiquetas y no un vector.

Para hacer lo que describís, la última y solo la última línea del algoritmo debe hacer $resultado = json_encode($vector); y no usar json_encode() antes.

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

¿Eres Usuario Apple?

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta