Página 2 de 3

Re: Cliente JSON para consumir servicio REST en PHP

NotaPublicado: 2011-07-01 02:35 @149
por scout
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.

Re: Cliente JSON para consumir servicio REST en PHP

NotaPublicado: 2011-07-01 05:24 @266
por scout
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

Re: Cliente JSON para consumir servicio REST en PHP

NotaPublicado: 2011-07-01 10:01 @459
por explorer
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.

Re: Cliente JSON para consumir servicio REST en PHP

NotaPublicado: 2011-07-01 10:48 @492
por scout
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

Re: Cliente JSON para consumir servicio REST en PHP

NotaPublicado: 2011-07-01 16:51 @743
por explorer
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});

Re: Cliente JSON para consumir servicio REST en PHP

NotaPublicado: 2011-07-02 17:39 @777
por scout
Ok, lo pruebo y os digo... Gracias...

Re: Cliente JSON para consumir servicio REST en PHP

NotaPublicado: 2011-07-03 02:48 @158
por scout
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

Re: Cliente JSON para consumir servicio REST en PHP

NotaPublicado: 2011-07-03 06:03 @294
por explorer
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

Re: Cliente JSON para consumir servicio REST en PHP

NotaPublicado: 2011-07-03 06:26 @309
por scout
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.019 segundos, usando GeSHi 1.0.8.4

Re: Cliente JSON para consumir servicio REST en PHP

NotaPublicado: 2011-07-03 11:56 @539
por explorer
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.