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.
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.
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>';
?>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.
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.