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 1 de 2  [ 23 mensajes ]  Ir a página 1, 2  Siguiente
 
Nota 2011-06-30 09:06 @420

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


Nota 2011-06-30 09:46 @449
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
El error dice que el módulo ha recibido una cadena de caracteres en lugar de una referencia a un hash.

Te recomiendo que

* uses el módulo Data::Dumper para ver el contenido de las variables, cuando no sepas qué es lo que contienen

* uses el marcado de texto PHP y Perl para que tus mensajes sean más claros.

_________________
JF^D Perl programming


Nota 2011-06-30 10:36 @483

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;
}


Nota 2011-06-30 11:06 @504
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
Con el operador asignación: '='.

_________________
JF^D Perl programming


Nota 2011-06-30 11:56 @538

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 ;


Nota 2011-06-30 12:50 @576
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
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:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. print $res->result;

_________________
JF^D Perl programming


Nota 2011-06-30 13:19 @596

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

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. use Data::Dumper;
  4. use JSON::RPC::Client;
  5. my $client = new JSON::RPC::Client;
  6. my $url    = 'http://192.168.1.42/service.php/sayHello';
  7. my $valor;
  8. my $resultado;
  9. my $yourname = 'pedro';
  10. my $res;
  11. my $llamadodedirecciones = { method => "sayHello", params => $yourname, };
  12. print Dumper $llamadodedirecciones;
  13. res = $client->call( $url, $llamadodedirecciones );
  14. print $res->result;
  15.  


Nota 2011-06-30 17:03 @752
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
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:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. sub new {
  2.     my ($class, $obj, $json) = @_;
  3.     my $content = ( $json || JSON->new->utf8 )->decode( $obj->content );
  4.  
  5.     my $self = bless {
  6.         jsontext  => $obj->content,
  7.         content   => $content,
  8.     }, $class;
  9.  
  10.     $content->{error} ? $self->is_success(0) : $self->is_success(1);
  11.  
  12.     $content->{version} ? $self->version(1.1) : $self->version(0) ;
  13.  
  14.     $self;
  15. }
esto es dentro del paquete JSON::RPC::ReturnObject, que es llamado desde la línea 118:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. sub call {
  2.     my ($self, $uri, $obj) = @_;
  3.     my $result;
  4.  
  5.     if ($uri =~ /\?/) {
  6.        $result = $self->_get($uri);
  7.     }
  8.     else {
  9.         Carp::croak "not hashref." unless (ref $obj eq 'HASH');
  10.         $result = $self->_post($uri, $obj);
  11.     }
  12.  
  13.     my $service = $obj->{method} =~ /^system\./ if ( $obj );
  14.  
  15.     $self->status_line($result->status_line);
  16.  
  17.     if ($result->is_success) {
  18.  
  19.         return unless($result->content); # notification?
  20.  
  21.         if ($service) {
  22.             return JSON::RPC::ServiceObject->new($result, $self->json);
  23.         }
  24.  
  25.         return JSON::RPC::ReturnObject->new($result, $self->json);
  26.     }
  27.     else {
  28.         return;
  29.     }
  30. }
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


Nota 2011-06-30 17:09 @756

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...


Nota 2011-06-30 17:12 @758
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
Actualización: ¿Y si cambias la línea 11 de tu código por esta:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $llamadodedirecciones = { method => "sayHello", params => [ $yourname ], };
?

_________________
JF^D Perl programming


Nota 2011-07-01 02:35 @149

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.


Nota 2011-07-01 05:24 @266

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

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.1.42/service.php/sayHello");
  7. print Dumper $c;
  8.  my $results = $c->echo($yourname);
  9. print Dumper $results;



Error del nuevo cliente :

Syntax: [ Download ] [ Hide ]
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.

Syntax: [ Download ] [ Hide ]
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' );


Última edición por explorer el 2011-07-01 09:25 @434, editado 2 veces en total
Marcas de texto y Perl


Nota 2011-07-01 10:01 @459
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
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


Nota 2011-07-01 10:48 @492

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..

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.1.42/service.php/sayHello","debug");
  7. #print Dumper $c;
  8.  my $results = $c->echo($yourname);


error con el debug

Syntax: [ Download ] [ Hide ]
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.


Nota 2011-07-01 16:51 @743
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
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


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

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