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

Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-06-30 09:06 @420

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
Razón: perl => Perl, json => JSON, php => PHP, rest => REST
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 explorer » 2011-06-30 09:46 @449

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

Re: Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-06-30 10:36 @483

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;
}
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-06-30 11:06 @504

Con el operador asignación: '='.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-06-30 11:56 @538

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

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:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print $res->result;
Coloreado en 0.003 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-06-30 13:19 @596

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

Sintáxis: [ Descargar ] [ Ocultar ]
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.  
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-06-30 17:03 @752

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
esto es dentro del paquete JSON::RPC::ReturnObject, que es llamado desde la línea 118:
Sintáxis: [ Descargar ] [ Ocultar ]
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. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cliente JSON para consumir servicio REST en PHP

Notapor scout » 2011-06-30 17:09 @756

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...
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-06-30 17:12 @758

Actualización: ¿Y si cambias la línea 11 de tu código por esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $llamadodedirecciones = { method => "sayHello", params => [ $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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Intermedio

¿Quién está conectado?

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