2011-06-30 09:06 @420 |
|
|
scout
Perlero Adicto
|
Registrado: 2009-10-28 13:50 @618 Mensajes: 225
|
|
|
Cliente JSON para consumir servicio REST en PHP
|
|
Buenas, paso a contaros una variante que voy haciendo mientras voy aprendiendo de qué van los servicios REST. Estoy tratando de adaptar un cliente Perl/JSON para consumir un servicio REST/PHP/JSON. El mismo con un cliente en PHP funciona bien pero al querer conectarme con el ejemplo de use JSON::RPC::Client; da el siguiente error.
Como siempre la idea es comparar códigos y tomar un punto de partida en base a los ejemplos que voy encontrando…
Error :
Script Output : Executing file : C:\clienteperlphp.pl
Can't use string ("Hello Array!") as a HASH ref while "strict refs" in use at C:/Perl/site/lib/JSON/RPC/Client.pm line 193.
El código del cliente Perl es el siguiente:
use strict; use warnings; use JSON::RPC::Client; my $client = new JSON::RPC::Client; my $url= 'http://192.168.1.2/service.php/sayHello'; my $valor ; my %hash ; my $yourname = 'pedro'; my $llamadodedirecciones = { method => "sayHello", params => [$yourname], }; my $res = $client->call($url, $llamadodedirecciones); if($res) { if ($res->is_error) { print "Error : ", $res->error_message; } else { print $res->result; } } else { print $client->status_line; } $client->prepare($url, ['sayHello', 'echo']); print $client->sayHello($yourname );
El código del cliente en PHP que funciona es :
<?php class JSON_WebClient{ private $URL; public function __construct($url) { $this->URL = $url; } public function call($method, $args, $successCallback = false, $errorCallback = false) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: application/json")); curl_setopt($ch, CURLOPT_URL, $this->URL."/".$method); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($args)); $resposeText = curl_exec($ch); $resposeInfo = curl_getinfo($ch); if($resposeInfo["http_code"] == 200) { if($successCallback) call_user_func($successCallback, json_decode($resposeText)); } else { if($errorCallback) call_user_func($errorCallback, json_decode($resposeText)); } } } $client = new JSON_WebClient("http://192.168.1.2/service.php"); $yourname = "pedro"; $client->call("sayHello", $yourname, "onSucceededCallback", "onErrorCallback"); function onSucceededCallback($result) { print $result; } function onErrorCallback($error) { print "Error: ".$error->{"message"}; } ?>
| Última edición por explorer el 2011-06-30 09:31 @438, editado 2 veces en total |
| perl => Perl, json => JSON, php => PHP, rest => REST |
|
2011-06-30 10:36 @483 |
|
|
scout
Perlero Adicto
|
Registrado: 2009-10-28 13:50 @618 Mensajes: 225
|
|
|
Re: Cliente JSON para consumir servicio REST en PHP
|
|
Perfecto, el Dumper me ayudó para poder enviar correctamente la variable y recibir el mensaje de "hola pedro" , pero sigo recibiéndolo como cadena.
¿Cómo puedo capturar esa cadena en una variable para poder disponer de ella luego ?? Estoy tratando de imprimir $res pero no me responde...
use strict; use warnings; use Data::Dumper; use JSON::RPC::Client; my $client = new JSON::RPC::Client; my $url= 'http://192.168.1.42/service.php/sayHello'; my $valor ; my %hash ; my $yourname = 'pedro'; my $llamadodedirecciones = { method => "sayHello", params => $yourname, }; print Dumper $llamadodedirecciones ; my $res = $client->call($url, $llamadodedirecciones); print Dumper $res ; if($res) { if ($res->is_error) { print "Error : ", $res->error_message; } else { print $res->result; } } else { print $client->status_line; }
|
2011-06-30 11:56 @538 |
|
|
scout
Perlero Adicto
|
Registrado: 2009-10-28 13:50 @618 Mensajes: 225
|
|
|
Re: Cliente JSON para consumir servicio REST en PHP
|
|
Sigo un poco atascado. Según el ejemplo de CPAN el resultado tendría que estar en la variable $res; por ello está el print Dumper $res ; el resultado y código ahora son los siguientes,
resultado :
Script Output : Executing file : C:\javaproyectos2011\holamundo\clienteperlphp.pl
Can't use string ("Hello pedro!") as a HASH ref while "strict refs" in use at C:/Perl/site/lib/JSON/RPC/Client.pm line 193. $VAR1 = { 'params' => 'pedro', 'method' => 'sayHello' };
código cliente
use strict; use warnings; use Data::Dumper; use JSON::RPC::Client; my $client = new JSON::RPC::Client; my $url= 'http://192.168.1.42/service.php/sayHello'; my $valor ; my $resultado ; my $yourname = 'pedro'; my $res; my $llamadodedirecciones = { method => "sayHello", params => $yourname }; print Dumper $llamadodedirecciones ; $res = $client->call($url, $llamadodedirecciones); print Dumper $res ;
|
2011-06-30 12:50 @576 |
|
|
 |
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
|
El volcado que estás mostrando es el de la variable $llamadodedirecciones, no el de $res, así que aún no sabemos qué aspecto tiene. En la documentación, dice que tienes que llamar al método result() para ver el resultado de la llamada: Using perl Syntax Highlighting
_________________ JF^D Perl programming
|
2011-06-30 13:19 @596 |
|
|
scout
Perlero Adicto
|
Registrado: 2009-10-28 13:50 @618 Mensajes: 225
|
|
|
Re: Cliente JSON para consumir servicio REST en PHP
|
Sí, ya lo sé, es que hasta la variable $llamadodedirecciones es donde responde el Dumper, luego en la línea siguiente es donde comienza a dar error... Probé print $res->result; y quitar el if() de error de respuesta para que quede limpio el código y sigue dando lo mismo... lo que me llama la atención es que la respuesta llega "Hello pedro!"... pero no la puedo poner en una variable... Estoy tan cerca... Bueno, veré en un rato a ver si se me ocurre algo... Gracias, igualmente, explorer... Me gustaría dejar este ejemplo terminado, ya es algo personal... Error: Script Output : Executing file : C:\javaproyectos2011\holamundo\clienteperlphp.pl Can't use string ("Hello pedro!") as a HASH ref while "strict refs" in use at C:/Perl/site/lib/JSON/RPC/Client.pm line 193. $VAR1 = { 'params' => 'pedro', 'method' => 'sayHello' }; codigo depurado Using perl Syntax Highlighting use strict;
use warnings;
use Data::Dumper;
use JSON::RPC::Client;
my $client = new JSON::RPC::Client;
my $url = 'http://192.168.1.42/service.php/sayHello';
my $valor;
my $resultado;
my $yourname = 'pedro';
my $res;
my $llamadodedirecciones = { method => "sayHello", params => $yourname, };
print Dumper $llamadodedirecciones;
res = $client->call( $url, $llamadodedirecciones );
print $res->result;
|
2011-06-30 17:03 @752 |
|
|
 |
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
|
El problema no está en tu código (si sigue el ejemplo propuesto por el manual), sino que el error salta en la línea 193 del módulo: Using perl Syntax Highlighting sub new {
my ($class, $obj, $json) = @_;
my $content = ( $json || JSON->new->utf8 )->decode( $obj->content );
my $self = bless {
jsontext => $obj->content,
content => $content,
}, $class;
$content->{error} ? $self->is_success(0) : $self->is_success(1);
$content->{version} ? $self->version(1.1) : $self->version(0) ;
$self;
}
esto es dentro del paquete JSON::RPC::ReturnObject, que es llamado desde la línea 118: Using perl Syntax Highlighting sub call {
my ($self, $uri, $obj) = @_;
my $result;
if ($uri =~ /\?/) {
$result = $self->_get($uri);
}
else {
Carp::croak "not hashref." unless (ref $obj eq 'HASH');
$result = $self->_post($uri, $obj);
}
my $service = $obj->{method} =~ /^system\./ if ( $obj );
$self->status_line($result->status_line);
if ($result->is_success) {
return unless($result->content); # notification?
if ($service) {
return JSON::RPC::ServiceObject->new($result, $self->json);
}
return JSON::RPC::ReturnObject->new($result, $self->json);
}
else {
return;
}
}
que es justo en nuestra famosa llamada call(). Y además está dentro de un if(), en la parte de éxito de la llamada. Lo que se pasa a JSON::RPC::ReturnObject, es $self->json, que se crea en la línea línea 23 (es un accesor). Y el contenido de $self->{json} viene de... Con el depurador paso a paso se podría saber por dónde va la información y qué valores se crean. Quizás el problema sea el propio módulo JSON::RPC::Client... está sin actualizar desde el año 2008. En cambio, el módulo JSON está muy actualizado (hace un mes). Podrías probar otro módulo más moderno, como JSON::RPC::Simple (aunque, es simple).
_________________ JF^D Perl programming
|
2011-06-30 17:09 @756 |
|
|
scout
Perlero Adicto
|
Registrado: 2009-10-28 13:50 @618 Mensajes: 225
|
|
|
Re: Cliente JSON para consumir servicio REST en PHP
|
|
Ok, explorer, pedazo de curro te mandaste. Gracias de verdad, me encantaría saber un pelín más para no dar la nota en estos foros...
Probaré con otro módulo y os cuento... gracias... nuevamente...
|
2011-06-30 17:12 @758 |
|
|
 |
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
|
Actualización: ¿Y si cambias la línea 11 de tu código por esta: Using perl Syntax Highlighting my $llamadodedirecciones = { method => "sayHello", params => [ $yourname ], };
?
_________________ JF^D Perl programming
|
2011-07-01 02:35 @149 |
|
|
scout
Perlero Adicto
|
Registrado: 2009-10-28 13:50 @618 Mensajes: 225
|
|
|
Re: Cliente JSON para consumir servicio REST en PHP
|
|
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.
|
2011-07-01 05:24 @266 |
|
|
scout
Perlero Adicto
|
Registrado: 2009-10-28 13:50 @618 Mensajes: 225
|
|
|
Re: Cliente JSON para consumir servicio REST en PHP
|
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 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.1.42/service.php/sayHello");
print Dumper $c;
my $results = $c->echo($yourname);
print Dumper $results;
Error del nuevo cliente : 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. Using perl Syntax Highlighting $VAR1 = bless( {
'ua' => bless( {
'max_redirect' => 7,
'protocols_forbidden' => undef,
'show_progress' => undef,
'handlers' => {
'response_header' => bless( [
{
'owner' => 'LWP::UserAgent::parse_head',
'callback' => sub { "DUMMY" },
'm_media_type' => 'html',
'line' => 'C:/Perl/lib/LWP/UserAgent.pm:612'
}
], 'HTTP::Config' )
},
'no_proxy' => [],
'protocols_allowed' => undef,
'local_address' => undef,
'use_eval' => 1,
'requests_redirectable' => [
'GET',
'HEAD'
],
'timeout' => 180,
'def_headers' => bless( {
'user-agent' => 'JSON::RPC::Simple 0.03'
}, 'HTTP::Headers' ),
'proxy' => {},
'max_size' => undef
}, 'LWP::UserAgent' ),
'uri' => 'http://192.168.1.42/service.php/sayHello',
'json' => bless( do{\(my $o = '')}, 'JSON' )
}, 'JSON::RPC::Simple::Client' );
| Última edición por explorer el 2011-07-01 09:25 @434, editado 2 veces en total |
| Marcas de texto y Perl |
|
2011-07-01 10:48 @492 |
|
|
scout
Perlero Adicto
|
Registrado: 2009-10-28 13:50 @618 Mensajes: 225
|
|
|
Re: Cliente JSON para consumir servicio REST en PHP
|
con el debug como paramentro el codigo queda asi y la respuesta va debajo.. 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.1.42/service.php/sayHello","debug");
#print Dumper $c;
my $results = $c->echo($yourname);
error con el debug Using perl 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.
|
| 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 |
 |
|