• Publicidad

Cliente JSON para consumir servicio REST en PHP

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Re: Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-07-01 02:35 @149

Si lo paso así lo único que logro es que la función no tome el nombre "pedro " que le envío, ese fue uno de los cambio que realicé gracias al Dumper, en esa oportunidad la respuesta de la función era "Hello Array".
Sigo probando... y en un rato pruebo con el otro módulo.
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Publicidad

Re: Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-07-01 05:24 @266

Opción con JSON::RPC::Simple, veo que este modulo necesita tener el servidor preparado en Perl con el mismo módulo en server. lLa idea principal es poder conectar Perl contra cualquier servicio web / REST / JSON. Por ello probé uno simple en PHP... igualmente lo probé creando un nuevo cliente y poniendo Dumper para ver las variables y veo que envía mucha más información que el cliente anterior... y lógicamente dio error.
Seguiré probando opciones... a ver si me ilumino...


Primero pondré el código del cliente nuevo y luego el error ya que es muy largo..

Código del cliente con JSON::RPC::Simple

Sintáxis: [ Descargar ] [ Ocultar ]
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.1.42/service.php/sayHello");
  7. print Dumper $c;
  8.  my $results = $c->echo($yourname);
  9. print Dumper $results;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Error del nuevo cliente :

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Script Output :
Executing file : C:\clientejson.pl

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.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $VAR1 = bless( {
  2.                  'ua' => bless( {
  3.                                   'max_redirect' => 7,
  4.                                   'protocols_forbidden' => undef,
  5.                                   'show_progress' => undef,
  6.                                   'handlers' => {
  7.                                                   'response_header' => bless( [
  8.                                                                                 {
  9.                                                                                   'owner' => 'LWP::UserAgent::parse_head',
  10.                                                                                   'callback' => sub { "DUMMY" },
  11.                                                                                   'm_media_type' => 'html',
  12.                                                                                   'line' => 'C:/Perl/lib/LWP/UserAgent.pm:612'
  13.                                                                                 }
  14.                                                                               ], 'HTTP::Config' )
  15.                                                 },
  16.                                   'no_proxy' => [],
  17.                                   'protocols_allowed' => undef,
  18.                                   'local_address' => undef,
  19.                                   'use_eval' => 1,
  20.                                   'requests_redirectable' => [
  21.                                                                'GET',
  22.                                                                'HEAD'
  23.                                                              ],
  24.                                   'timeout' => 180,
  25.                                   'def_headers' => bless( {
  26.                                                             'user-agent' => 'JSON::RPC::Simple 0.03'
  27.                                                           }, 'HTTP::Headers' ),
  28.                                   'proxy' => {},
  29.                                   'max_size' => undef
  30.                                 }, 'LWP::UserAgent' ),
  31.                  'uri' => 'http://192.168.1.42/service.php/sayHello',
  32.                  'json' => bless( do{\(my $o = '')}, 'JSON' )
  33.                }, 'JSON::RPC::Simple::Client' );
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-07-01 09:25 @434, editado 2 veces en total
Razón: Marcas de texto y Perl
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Re: Cliente JSON para consumir servicio REST en PHP

Notapor explorer » 2011-07-01 10:01 @459

Empiezo a sospechar de que el problema está en el módulo JSON...

Lo dicho, habría que mirar el código ejecutándolo línea a línea a ver qué pasa. El JSON::RPC::Simple::Client tiene una opción para activar un modo de depuración, con la opción debug pasándola en el new(). Al menos, sacará algo de información en pantalla.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-07-01 10:48 @492

con el debug como paramentro el codigo queda asi y la respuesta va debajo..

Sintáxis: [ Descargar ] [ Ocultar ]
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.1.42/service.php/sayHello","debug");
  7. #print Dumper $c;
  8.  my $results = $c->echo($yourname);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


error con el debug

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. Script Output :
  2. Executing file : C:\clientejson.pl
  3.  
  4. 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.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Re: Cliente JSON para consumir servicio REST en PHP

Notapor explorer » 2011-07-01 16:51 @743

No lo has puesto bien... hay que prestar más atención al manual...

my $c = JSON::RPC::Simple::Client->new('http://192.168.1.42/service.php/sayHello', {debug => 1});
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-07-02 17:39 @777

Ok, lo pruebo y os digo... Gracias...
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Re: Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-07-03 02:48 @158

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.


Sintáxis: [ Descargar ] [ Ocultar ]
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);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



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

Sintáxis: [ Descargar ] [ Ocultar ]
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.
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-07-03 05:28 @269, editado 1 vez en total
Razón: quitar espacios delante de comas, cambiar marcas sintaxis Perl por las de texto
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Re: Cliente JSON para consumir servicio REST en PHP

Notapor explorer » 2011-07-03 06:03 @294

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         $result = $self->{json}->decode($r->decoded_content);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

$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:
Sintáxis: [ Descargar ] [ Ocultar ]
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);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-07-03 06:26 @309

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.


Sintáxis: [ Descargar ] [ Ocultar ]
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);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Resultado nuevo

Sintáxis: [ Descargar ] [ Ocultar ]
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"}}}'
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4




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

Sintáxis: [ Descargar ] [ Ocultar ]
Using php Syntax Highlighting
  1.  if($resposeInfo["http_code"] == 200)
  2.         {
  3.             if($successCallback)
  4.                 call_user_func($successCallback, json_decode($resposeText));
  5.         }
Coloreado en 0.018 segundos, usando GeSHi 1.0.8.4
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Re: Cliente JSON para consumir servicio REST en PHP

Notapor explorer » 2011-07-03 11:56 @539

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados