Este documento descreve como obter e instalar o NuSOAP e, em seguida, fornece alguns exemplos para ilustrar as funções do NuSOAP. Esta não é uma introdução abrangente ao NuSOAP, mas espero que alguns desenvolvedores de PHP possam ter uma boa introdução.
NuSOAP é um conjunto de classes PHP que permite aos desenvolvedores criar e usar serviços web SOAP. Não requer a instalação de nenhuma extensão PHP. Foi desenvolvido em 3 de dezembro de 2004 e a versão atual é NuSOAP (0.6.7). Suportando a especificação SOAP 1.1, ele pode produzir e usar WSDL 1.1 e também oferece suporte a serviços rpc/codificados e documentos/literais. No entanto, é importante observar que o NuSOAP não fornece uma implementação completa como .NET e Apache Axis.
Olá, mundo
Começarei com o exemplo "Hello, World" e escreverei o código básico do cliente e do servidor NuSOAP.
Vamos começar primeiro pelo lado do servidor, porque sem o lado do servidor não faz sentido ter o lado do cliente. Vamos escrever um método SOAP chamado Hello que recebe um único parâmetro e retorna uma string, e esperamos que os comentários no código forneçam instruções úteis.
<?php
// Extrai o código NuSOAP
require_once('nusoap.php');
// Cria a instância do servidor
$servidor = novo soap_server;
// Registra o método a ser exposto
$servidor->registrar('olá');
//Define o método como uma função PHP
função olá($nome) {
return 'Olá, ' $nome;
}
// Use a solicitação para (tentar) invocar o serviço
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) $HTTP_RAW_POST_DATA : '';
$servidor->serviço($HTTP_RAW_POST_DATA);
?>
A seguir está o código do cliente. Há algumas coisas importantes a serem observadas: Primeiro, ao criar a instância soapclient, você precisa especificar uma URL de serviço como parâmetro. Neste exemplo, helloworld.php é acessado em http://. localhost/phphack de. Obviamente, os serviços que você deseja usar são colocados em URLs diferentes. Em segundo lugar, ao chamar o serviço, o primeiro parâmetro é o nome do serviço, que deve corresponder a um nome de método válido (alguns servidores diferenciam maiúsculas de minúsculas). Neste exemplo, deve corresponder ao método já cadastrado em helloworld.php. Por fim, o segundo parâmetro é um array que será passado como parâmetro para o método de serviço SOAP. Como o método hello em helloworld.php possui apenas um parâmetro, o array possui apenas um elemento.
<?php
// Extrai o código NuSOAP
require_once('nusoap.php');
// Cria a instância do cliente
$cliente = new soapclient('http://localhost/phphack/helloworld.php');
//Chama o método SOAP
$resultado = $client->call('olá', array('nome' => 'Scott'));
//Mostra o resultado
print_r($resultado);
?>
Depuração
Ao programar, você precisa depurar sempre que algo dá errado. NuSOAP fornece um conjunto de ferramentas para ajudá-lo a fazer isso. As informações que você precisa verificar ao depurar o NuSOAP são as informações da solicitação enviadas e as informações correspondentes retornadas. A classe cliente do NuSOAP permite visualizar essas informações através de seus dois membros. Por exemplo, aqui está uma versão modificada de helloworldclient.php que mostra a solicitação e a resposta. Na próxima seção analisarei as informações de solicitação e resposta exibidas no código do cliente.
<?php
// Extrai o código NuSOAP
require_once('nusoap.php');
// Cria a instância do cliente
$cliente = new soapclient('http://localhost/phphack/helloworld.php');
//Chama o método SOAP
$resultado = $client->call('olá', array('nome' => 'Scott'));
//Mostra o resultado
print_r($resultado);
//Exibe a solicitação e a resposta
echo '<h2>Solicitação</h2>';
echo '<pre>' htmlspecialchars($client->request, ENT_QUOTES) '</pre>';
echo '<h2>Resposta</h2>';
echo '<pre>' htmlspecialchars($client->response, ENT_QUOTES) '</pre>';
?>
NuSOAP também fornece um método para visualizar informações de depuração através de logs usando suas classes. Adicionar o código a seguir exibirá informações de depuração extensas. Infelizmente, a descrição da saída deve ser deixada para o leitor.
//Exibe as mensagens de depuração
echo '<h2>Depurar</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) '</pre>';
O servidor pode fornecer informações de depuração semelhantes. é exibido para que possa ser visualizado no cliente. A depuração do lado do servidor é semelhante a esta:
<?php
// Extrai o código NuSOAP
require_once('nusoap.php');
// Habilita a depuração *antes* de criar a instância do servidor
$depurar = 1;
// Cria a instância do servidor
$servidor = novo soap_server;
// Registra o método a ser exposto
$servidor->registrar('olá');
//Define o método como uma função PHP
função olá($nome) {
return 'Olá, ' $nome;
}
// Use a solicitação para (tentar) invocar o serviço
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) $HTTP_RAW_POST_DATA : '';
$servidor->serviço($HTTP_RAW_POST_DATA);
?>
O terceiro método de depuração não é realmente depuração, é uma boa prática de programação. O exemplo acima não verifica erros ao chamar SOAP. Um cliente mais robusto ficaria assim:
<?php.
// Extrai o código NuSOAP
require_once('nusoap.php');
// Cria a instância do cliente
$cliente = new soapclient('http://localhost/phphack/helloworld.php');
//Verifica se há algum erro
$err = $cliente->getError();
se ($errar) {
//Mostra o erro
echo '<p><b>Erro do construtor: ' . $err '</b></p>';
// Neste ponto, você sabe que a chamada a seguir falhará
}
//Chama o método SOAP
$resultado = $client->call('olá', array('nome' => 'Scott'));
//Verifica se há uma falha
if ($cliente->falha) {
echo '<p><b>Falha: ';
print_r($resultado);
eco '</b></p>';
} outro {
//Verifica se há erros
$err = $cliente->getError();
se ($errar) {
//Mostra o erro
echo '<p><b>Erro: ' . $err '</b></p>';
} outro {
//Mostra o resultado
print_r($resultado);
}
}
?>
Para testar o código, você precisa causar a ocorrência de um erro, por exemplo, alterar o nome do método chamado hello para adeus.
Solicitação e Resposta
Mostrei no exemplo acima como é fácil exibir informações de solicitação e resposta SOAP. Aqui estão as informações de solicitação para hello2client.php:
POST /phphack/helloworld2.php HTTP/1.0
Anfitrião: localhost
Agente do usuário: NuSOAP/0.6.8 (1.81)
Tipo de conteúdo: text/xml charset=ISO-8859-1;
SOAPAction: ""
Comprimento do conteúdo: 538
<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/ "
xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xmlns:SOAP-ENC=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:si=" http://soapinterop.org/xsd ">
<SOAP-ENV:Corpo>
<ns1:olá xmlns:ns1=" http://testuri.org ">
<name xsi:type="xsd:string">Scott</name>
</ns1:olá>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Nos cabeçalhos HTTP, você verá que SOAPAction é uma string vazia, que é seu valor padrão. Seu método de serviço pode definir o valor de SOAPAction e seu código cliente pode chamar o método especificando SOAPAction como parâmetro.
Na carga XML, você pode ver que NuSOAP usa a conhecida codificação ISO-8859-1 como Latin-1. Para especificar uma codificação diferente, você pode definir o atributo soap_defencoding na instância do cliente soapclient. É claro que é responsabilidade do programador codificar os dados dos parâmetros usando a codificação especificada. Felizmente, o PHP oferece muitas funções para codificar e decodificar os dados de codificação mais comuns em SOAP, como UTF-8.
Outra coisa a observar é que o elemento especifica o método a ser chamado. O elemento chamado hello é colocado sob o nome de domínio http://tempuri.org . Especificar o nome de domínio real é uma prática recomendada e também é muito comum para muitos serviços. .É necessário. Um documento futuro é mostrado aqui:
O serviço SOAP responde assim:
HTTP/1.1 200 OK
Servidor: Microsoft-IIS/5.0
Data: Quarta, 03 de novembro de 2004 21:32:34 GMT
X-Desenvolvido por: ASP.NET
X-Powered-By: PHP/4.3.4
Servidor: Servidor NuSOAP v0.6.8
Servidor X-SOAP: NuSOAP/0.6.8 (1.81)
Tipo de conteúdo: text/xml charset=ISO-8859-1;
Comprimento do conteúdo: 556
<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/ "
xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xmlns:SOAP-ENC=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:si=" http://soapinterop.org/xsd ">
<SOAP-ENV:Corpo>
<ns1:helloResponse xmlns:ns1=" http://tempuri.org ">
<return xsi:type="xsd:string">Olá, Scott</return>
</helloResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>