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.