2011-07-02 17:39 @777 |
|
|
scout
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...
|
2011-07-03 02:48 @158 |
|
|
scout
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. Using perl Syntax Highlighting use strict;
use warnings;
use Data::Dumper;
use JSON::RPC::Simple::Client;
my $yourname = 'pedro';
my $c = JSON::RPC::Simple::Client->new('http://192.168.0.46/service.php/sayHello', {debug => 1});
my $results = $c->echo($yourname);
Script Output : Executing file : C:\clientesimpledeserviciophp.pl 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 |
|
2011-07-03 06:03 @294 |
|
|
 |
explorer
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: Using perl Syntax Highlighting $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: Using perl Syntax Highlighting my $yourname = 'pedro';
my $c = JSON::RPC::Simple::Client->new('http://192.168.0.46/service.php', {debug => 1});
my $results = $c->sayHello($yourname);
_________________ JF^D Perl programming
|
2011-07-03 06:26 @309 |
|
|
scout
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. Using perl Syntax Highlighting use strict;
use warnings;
use Data::Dumper;
use JSON::RPC::Simple::Client;
my $yourname = 'pedro';
my $c = JSON::RPC::Simple::Client->new('http://192.168.0.46/service.php', {debug => 1});
my $results = $c->sayHello($yourname);
Resultado nuevo 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 Using php Syntax Highlighting if($resposeInfo["http_code"] == 200)
{
if($successCallback)
call_user_func($successCallback, json_decode($resposeText));
}
|
2011-07-03 11:56 @539 |
|
|
 |
explorer
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: Using perl Syntax Highlighting use strict;
use warnings;
use Data::Dumper;
use JSON ();
use JSON::RPC::Simple::Client;
my $json = JSON->new->utf8->allow_nonref;
my $yourname = 'pedro';
my $c = JSON::RPC::Simple::Client->new(
'http://192.168.0.46/service.php/sayHello',
{
debug => 1,
json => $json,
}
);
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
|
2011-07-03 16:02 @709 |
|
|
scout
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... Using php Syntax Highlighting function sayHello($yourname)
{
return "Hello ".$yourname."!";
}
Using php Syntax Highlighting
private function call($name, $args) {
if ($this->methods[$name] == true) {
$result = call_user_func_array($name, $args);
return json_encode($result);
}
}
Utilizando el código propuesto la respuesta fue la siguiente 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.
|
2011-07-03 16:53 @745 |
|
|
 |
explorer
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: Using perl Syntax Highlighting 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 
_________________ JF^D Perl programming
|
2011-07-03 17:08 @755 |
|
|
scout
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.
|
| 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
|
|
Socializa |
 |
|