2. Deteção de erros ("debugging")

Como acontece com toda a programação, há momentos em que vai ser necessário corrigir erros e para isso localizá-los, o que já é difícil numa aplicação normal e mais será numa distribuída. Nas próximas secções iremos apresentar várias metodologias que poderão ser usadas para uma deteção de erros mais ou menos apurada.

2.1. Visualização do pedido e da resposta

O NuSOAP fornece algumas facilidades que nos podem ajudar. Com SOAP, um passo típico na deteção de erros é ver o pedido a ser enviado e a resposta a ser devolvida. A classe nusoap_client tem métodos que nos permitem visualizar estes. No exemplo seguinte pode ver o mesmo exemplo, agora enriquecido com a visualização do pedido e da resposta.

Exemplo 2.4. Cliente com visualização do pedido e da resposta

<?php
// Pull in the NuSOAP code
require_once('../lib/nusoap.php');

// Create the client instance
// Server Locations
// $location = 'http://localhost:8888/nusoap-0.9.5/Hello/serv-hello.php';
$location ='http://epl.di.uminho.pt/~jcr/jcrbin/php-projects/nusoap-0.9.5/Hello/serv-hello.php';

$client = new nusoap_client( $location, false);

$name = $_REQUEST['name'];

// Call the SOAP method
$result = $client->call('hello', array('name' => $name));

// Display the result
print_r($result);

// Display the request and response
echo '<h2>Request</h2>';
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
?>

Mais à frente, nalguns exemplos, iremos analisar os pedidos enviados e as respostas recebidas.

2.2. Visualização da informação resultante das ações executadas

A classe NuSOAP vai registando em logs as várias ações que vai realizando. Esses logs poderão ser usados também para debug da aplicação.

Na versão seguinte do cliente, adicionou-se no fim o código para visualizar esta informação. É claro que a interpretação desta tem de ser feita por nós humanos...

Exemplo 2.5. Cliente que imprime a informação de debug

<?php
// Pull in the NuSOAP code
require_once('../lib/nusoap.php');

// Create the client instance
// Server Locations
// $location = 'http://localhost:8888/nusoap-0.9.5/Hello/serv-hello.php';
$location ='http://epl.di.uminho.pt/~jcr/jcrbin/php-projects/nusoap-0.9.5/Hello/serv-hello.php';

$client = new nusoap_client( $location, false);

$name = $_REQUEST['name'];

// Call the SOAP method
$result = $client->call('hello', array('name' => $name));

// Display the result
print_r($result);

// Display the request and response
echo '<h2>Request</h2>';
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';

// Display the debug messages
echo '<h2>Debug</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>

2.3. Teste de falha na chamada SOAP

Os exemplos apresentados até agora não verificaram a existência de erros durante a chamada SOAP. Assim, e como exemplo de boa programação chegamos ao último exemplo desta secção.

Exemplo 2.6. Cliente que testa falhas na chamada do serviço

<?php
// Pull in the NuSOAP code
require_once('../lib/nusoap.php');

// Create the client instance
// Server Locations
// $location = 'http://localhost:8888/nusoap-0.9.5/Hello/serv-hello.php';
$location ='http://epl.di.uminho.pt/~jcr/jcrbin/php-projects/nusoap-0.9.5/Hello/serv-hello.php';

$client = new nusoap_client( $location, false);

// Check for an error
$err = $client->getError();
if ($err) 
  {
    // Display the error
    echo '<p><b>Erro na criação do serviço: ' . $err . '</b></p>';
    // At this point, you know the call that follows will fail
  }

$name = $_REQUEST['name'];

// Call the SOAP method
$result = $client->call('hello', array('name' => $name));

// Check for a fault
if ($client->fault) 
  {
    echo '<p><b>Fault: ';
    print_r($result);
    echo '</b></p>';
  } 
else {
    // Check for errors
    $err = $client->getError();
    if ($err) 
      {
        // Display the error
        echo '<p><b>Erro: ' . $err . '</b></p>';
      } 
    else 
      {
        // Display the result
        print_r($result);
      }
}
?>

Deste último exemplo, podemos extrair a estrutura base de um cliente que deverá ser usada nas aplicações que se vierem a implementar.

2.4. Esqueleto base de um cliente

Exemplo 2.7. Esqueleto para um cliente com tratamento de erros

<?php
// Pull in the NuSOAP code
require_once('../lib/nusoap.php');

// Create the client instance
$location ='http://server.location/serv-X.php';
$client = new nusoap_client( $location, false);

// Check for an error
$err = $client->getError();
if ($err) 
  {
    // Display the error
    echo '<p><b>Erro na criação do serviço: ' . $err . '</b></p>';
    // At this point, you know the call that follows will fail
  }
// Get parameters if any...
$param1 = $_REQUEST['parama1'];
$param2 = ...

// Call the SOAP method
$result = $client->call('hello', array('param1' => $param1, 'param2' => $param2, ...));

// Check for a fault
if ($client->fault) 
  {
    echo '<p><b>Fault: ';
    print_r($result);
    echo '</b></p>';
  } 
else {
    // Check for errors
    $err = $client->getError();
    if ($err) 
      {
        // Display the error
        echo '<p><b>Erro: ' . $err . '</b></p>';
      } 
    else 
      {
        // Display the result or do something with result
        print_r($result);
      }
}
?>

A partir deste momento, grave este conteúdo no ficheiro do novo cliente que quer implementar e altere o que for necessário.

Nas secções seguintes vamos ver como parametrizar argumentos e resultados.