Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Intermedio » Cliente JSON para consumir servicio REST en PHP Responder al tema
Nuevo tema


Página 2 de 2  [ 23 mensajes ]  Ir a página Anterior  1, 2
 
Nota 2011-07-02 17:39 @777

Perlero Adicto
Registrado: 2009-10-28 13:50 @618
Mensajes: 225
Re: Cliente JSON para consumir servicio REST en PHP
Ok, lo pruebo y os digo... Gracias...


Nota 2011-07-03 02:48 @158

Perlero Adicto
Registrado: 2009-10-28 13:50 @618
Mensajes: 225
Re: Cliente JSON para consumir servicio REST en PHP
Disculpad la demora. Tuve que reproducir el entorno de pruebas en otro ordenador. Volvamos al lio. Dejando el cliente con el correcto debug (gracias, explorer) queda así, y el resultado está debajo, que muestra el resultado correcto Raw content: '"Hello pedro!"}' pero da esa línea referente al JSON.


Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.     use strict;
  2.     use warnings;
  3.     use Data::Dumper;
  4.     use JSON::RPC::Simple::Client;
  5.      my $yourname = 'pedro';
  6.      my $c = JSON::RPC::Simple::Client->new('http://192.168.0.46/service.php/sayHello', {debug => 1});
  7.      my $results = $c->echo($yourname);



Script Output :
Executing file : C:\clientesimpledeserviciophp.pl

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
Raw content: '"Hello pedro!"}'
JSON text must be an object or array (but found number, string, true, false or null, use allow_nonref to allow this) at C:/perl/site/lib/JSON/RPC/Simple/Client.pm line 80.
 


Última edición por explorer el 2011-07-03 05:28 @269, editado 1 vez en total
quitar espacios delante de comas, cambiar marcas sintaxis Perl por las de texto


Nota 2011-07-03 06:03 @294
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cliente JSON para consumir servicio REST en PHP
Ahora queda un poco más claro el error.

El servidor no está devolviendo una estructura JSON, sino que está devolviendo la cadena "Hello pedro!" (comillas incluidas).

O la línea 80 del módulo es incorrecta:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.         $result = $self->{json}->decode($r->decoded_content);

$r->decoded_content devuelve "Hello pedro!", y eso no le gusta a decode(). Debería ser algo así: { "sayHello": "Hello pedro!" }.

Prueba cambiando estas líneas:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $yourname = 'pedro';
  2. my $c = JSON::RPC::Simple::Client->new('http://192.168.0.46/service.php', {debug => 1});
  3. my $results = $c->sayHello($yourname);

_________________
JF^D Perl programming


Nota 2011-07-03 06:26 @309

Perlero Adicto
Registrado: 2009-10-28 13:50 @618
Mensajes: 225
Re: Cliente JSON para consumir servicio REST en PHP
Hice dos pruebas con cliente nuevo y error adjunto, y también probé con el URL original http://192.168.0.46/service.php/sayHello ya que el error con el cambio propuesto al final daba error 500 pero volvemos al error anterior.

Lo que me llama la atención es que el cliente PHP lo decodifica bien.


Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use strict;
  2.     use warnings;
  3.     use Data::Dumper;
  4.     use JSON::RPC::Simple::Client;
  5.     my $yourname = 'pedro';
  6.     my $c = JSON::RPC::Simple::Client->new('http://192.168.0.46/service.php', {debug => 1});
  7.     my $results = $c->sayHello($yourname);


Resultado nuevo

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
Script Output :
Executing file : C:\clientesimpledeserviciophp.pl

Raw content: '{"message":"Function '\/service.php' does not exist.","code":0,"file":"C:\\AppServ\\www\\service.php","line":30,"stackTrace":[{"file":"C:\\AppServ\\www\\service.php","line":62,"function":"start","class":"JSON_WebService","type":"->","args":[]}],"status":{"message":"Internal server error","code":"500"}}}'




Sé que no es de este foro pero para confirmar que el cliente PHP lo decodifica bien revisé el mismo adjunto if() de conexión en cliente PHP

Syntax: [ Download ] [ Hide ]
Using php Syntax Highlighting
  1.  if($resposeInfo["http_code"] == 200)
  2.         {
  3.             if($successCallback)
  4.                 call_user_func($successCallback, json_decode($resposeText));
  5.         }


Nota 2011-07-03 11:56 @539
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cliente JSON para consumir servicio REST en PHP
Bueno, ya vemos cómo es el mensaje de respuesta del servidor, que, efectivamente, es en formato JSON.

El problema entonces es cuando se ejecuta el método sayHello, que parece que no devuelve una estructura JSON.

Apuesto a que el problema está en el servidor, que devuelve cadenas de caracteres, como valor de resultado, en lugar de una estructura completa JSON.

Hay una opción en JSON que se llama allow_nonref, que permite que se le pase al módulo JSON valores que no están dentro de una estructura.

Prueba con esto:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. use Data::Dumper;
  4. use JSON ();
  5. use JSON::RPC::Simple::Client;
  6.  
  7. my $json = JSON->new->utf8->allow_nonref;
  8. my $yourname = 'pedro';
  9. my $c = JSON::RPC::Simple::Client->new(
  10.     'http://192.168.0.46/service.php/sayHello',
  11.     {
  12.         debug => 1,
  13.         json  => $json,
  14.     }
  15. );
  16. my $results = $c->echo($yourname);

Aquí, estamos creando un objeto JSON, pero con la característica de que tiene activada la opción allow_nonref. Luego, se lo pasamos a JSON::RPC::Simple::Client, para que use ese objeto en lugar del de por defecto, que es simplemente JSON->new->utf8.

_________________
JF^D Perl programming


Nota 2011-07-03 16:02 @709

Perlero Adicto
Registrado: 2009-10-28 13:50 @618
Mensajes: 225
Re: Cliente JSON para consumir servicio REST en PHP
Desde el lado del servidor la función es muy simple...
La función de llamada la adjunto debajo de la sayHello para confirmar el codificado...

Syntax: [ Download ] [ Hide ]
Using php Syntax Highlighting
  1. function sayHello($yourname)
  2. {
  3.          return "Hello ".$yourname."!";
  4. }

Syntax: [ Download ] [ Hide ]
Using php Syntax Highlighting
  1.  
  2.    private function call($name, $args) {
  3.         if ($this->methods[$name] == true) {
  4.             $result = call_user_func_array($name, $args);
  5.             return json_encode($result);
  6.         }
  7.     }

Utilizando el código propuesto la respuesta fue la siguiente

Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
Script Output :
Executing file : C:\clientesimpledeserviciophp.pl

Raw content: '"Hello pedro!"}'
Didn't get a JSON object back at C:/perl/site/lib/JSON/RPC/Simple/Client.pm line 83.


Nota 2011-07-03 16:53 @745
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10249
Re: Cliente JSON para consumir servicio REST en PHP
Nada que hacer... las líneas 75 a 85 del módulo JSON::RPC::Simple::Client requieren, de todas maneras, que el resultado sea siempre una referencia a un hash:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. die "Didn't get a JSON object back" unless ref $result eq "HASH";


La solución sería que el servidor respondiera siempre con una estructura JSON, y no con valores directos.

Habría otra posibilidad... pero habría que dar una voltereta...

Tendríamos que crear un paquete JSON propio, con nuestras propias funciones encode() y decode(), para que J::R::S:C lo aceptara, y así podríamos poner un if(), para que, en caso de que el servidor nos devuelva un valor de forma directa, convertirlo a un hash.

Es lo malo de los módulos Simple... que a veces son demasiado simples...

Otra cosa que puedes hacer... Editas el fichero C:/perl/site/lib/JSON/RPC/Simple/Client.pm y comentas (ocultas) la línea 83 :lol:

_________________
JF^D Perl programming


Nota 2011-07-03 17:08 @755

Perlero Adicto
Registrado: 2009-10-28 13:50 @618
Mensajes: 225
Re: Cliente JSON para consumir servicio REST en PHP
No pasa nada, todo bien, explorer. Gracias por darle vueltas. La idea de todas las pruebas que voy haciendo es para avanzar en conocimientos y comparar soluciones, sobre todo comparar...

Respecto a los servicios web seguiré probando alternativas para o hacia Perl o probando otros módulos de Perl. Lo bueno es que ya pasé por SOAP, WSDL y REST y me sirvió mucho para aprender... Si encuentro en un futuro la solución lo postearé y si alguien va por este camino al menos le ayudará en sus pruebas...

Nuevamente muchas gracias.


Responder al tema  [ 23 mensajes ]  Ir a página Anterior  1, 2

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO