Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá Amigos:
Tenho um WebService (soap) para testes, e estou construindo uma função para cadastrar um cliente:
Nessa função, ela irá receber uma variável por parâmetro do tipo "TCliente", e irá retornar um outro valor do tipo "TResultado".
Como pode ser visto o TCliente e TResultado são tipos de dados que eu crei.
Estou com dificuldades em passar o parâmetro do tipo TCLIENTE para a função, sempre que tento, o webservice me retorna erros:
Vou passar o código que estou utilizando no meu site (PHP - Estou utlizando a biblioteca padrão do SOAP no PHP 5):
class TCliente {
public $usuario;
public $senha;
public $tipoPessoa;
public $nomeRazao;
public $fantasia;
public $email;
public $cnpjCpf;
public $inscRg;
public $logradouro;
public $numero;
public $bairro;
public $cep;
public $cidade;
public $estado;
public $telResidencial;
public $telComercial;
public $telCelular;
public $ramoAtividade;
public $acordoAdeso;
public $acordoPriva;
}
$tCliente = new TCliente();
$tCliente->usuario = $_POST['edtUusuario'];
$tCliente->senha = $_POST['edtSenha'];
$tCliente->tipoPessoa = $_POST['edtTipoPessoa'];
$tCliente->nomeRazao = $_POST['edtNomeRazaoSocial'];
$tCliente->fantasia = $_POST['edtSobrenomeFantasia'];
$tCliente->email = $_POST['edtEmail'];
$tCliente->cnpjCpf = $_POST['edtCnpjCpf'];
$tCliente->inscRg = $_POST['edtCidade'];
$tCliente->logradouro = $_POST['edtLogradouro'];
$tCliente->numero = $_POST['edtLogradouroNumero'];
$tCliente->bairro = $_POST['edtBairro'];
$tCliente->cep = $_POST['edtCep'];
$tCliente->cidade = $_POST['edtCidade'];
$tCliente->estado = $_POST['edtEstado'];
$tCliente->telResidencial = $_POST['edtTelResidencial'];
$tCliente->telComercial = $_POST['edtTelComercial'];
$tCliente->telCelular = $_POST['edtTelCelular'];
$tCliente->ramoAtividade = $_POST['edtTipoNegocio'];
$tCliente->acordoAdeso = $_POST['cbContratoAdesao'];
$tCliente->acordoPriva = $_POST['cbPoliticaPrivacidade'];
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("http://localhost:8080/wsdl/ISiteCentercob");
$resultado = $client->CadastrarCliente($tCliente);
Eu já fiz testes em função retornando o tipo de dados TRESULTADO e consigo ler o retorno normalmente. Agora, se tento usar uma função passando por parâmetro, onde essa função recebe apenas dados de um tipo (que eu criei - TCliente), ela me retorna erros. Provavelmente a forma como estou passando os dados, está incorreta.
Alguém poderia me informar como deve ser a forma correta para passar um tipo de dados por parâmetro ?
Segue abaixo o XML do Webservice que mencionei:
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:ns1="urn:SiteCentercobIntf" name="ISiteCentercobservice" targetNamespace="http://tempuri.org/">
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:SiteCentercobIntf">
<complexType name="TResultado">
<sequence>
<element name="Resultado" type="xs:boolean"/>
<element name="Mensagem" type="xs:string"/>
<element name="CodCliente" type="xs:int"/>
</sequence>
</complexType>
<complexType name="TCliente">
<sequence>
<element name="usuario" type="xs:string"/>
<element name="senha" type="xs:string"/>
<element name="tipoPessoa" type="xs:string"/>
<element name="nomeRazao" type="xs:string"/>
<element name="fantasia" type="xs:string"/>
<element name="email" type="xs:string"/>
<element name="cnpjCpf" type="xs:string"/>
<element name="inscRg" type="xs:string"/>
<element name="logradouro" type="xs:string"/>
<element name="numero" type="xs:string"/>
<element name="bairro" type="xs:string"/>
<element name="cep" type="xs:string"/>
<element name="cidade" type="xs:string"/>
<element name="estado" type="xs:string"/>
<element name="telResidencial" type="xs:string"/>
<element name="telComercial" type="xs:string"/>
<element name="telCelular" type="xs:string"/>
<element name="ramoAtividade" type="xs:string"/>
<element name="acordoAdeso" type="xs:string"/>
<element name="acordoPriva" type="xs:string"/>
</sequence>
</complexType>
</schema>
</types>
<message name="VerificarUsuario0Request">
<part name="login" type="xs:string"/>
</message>
<message name="VerificarUsuario0Response">
<part name="return" type="ns1:TResultado"/>
</message>
<message name="VerificarCpfCnpj1Request">
<part name="tipoPessoa" type="xs:string"/>
<part name="cnpjCpf" type="xs:string"/>
</message>
<message name="VerificarCpfCnpj1Response">
<part name="return" type="ns1:TResultado"/>
</message>
<message name="CadastrarCliente2Request">
<part name="cliente" type="ns1:TCliente"/>
</message>
<message name="CadastrarCliente2Response">
<part name="return" type="ns1:TResultado"/>
</message>
<portType name="ISiteCentercob">
<operation name="VerificarUsuario">
<input message="tns:VerificarUsuario0Request"/>
<output message="tns:VerificarUsuario0Response"/>
</operation>
<operation name="VerificarCpfCnpj">
<input message="tns:VerificarCpfCnpj1Request"/>
<output message="tns:VerificarCpfCnpj1Response"/>
</operation>
<operation name="CadastrarCliente">
<input message="tns:CadastrarCliente2Request"/>
<output message="tns:CadastrarCliente2Response"/>
</operation>
</portType>
<binding name="ISiteCentercobbinding" type="tns:ISiteCentercob">
<binding xmlns="http://schemas.xmlsoap.org/wsdl/soap/" style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="VerificarUsuario">
<operation xmlns="http://schemas.xmlsoap.org/wsdl/soap/" soapAction="urn:SiteCentercobIntf-ISiteCentercob#VerificarUsuario" style="rpc"/>
<input>
<body xmlns="http://schemas.xmlsoap.org/wsdl/soap/" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:SiteCentercobIntf-ISiteCentercob"/>
</input>
<output>
<body xmlns="http://schemas.xmlsoap.org/wsdl/soap/" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:SiteCentercobIntf-ISiteCentercob"/>
</output>
</operation>
<operation name="VerificarCpfCnpj">
<operation xmlns="http://schemas.xmlsoap.org/wsdl/soap/" soapAction="urn:SiteCentercobIntf-ISiteCentercob#VerificarCpfCnpj" style="rpc"/>
<input>
<body xmlns="http://schemas.xmlsoap.org/wsdl/soap/" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:SiteCentercobIntf-ISiteCentercob"/>
</input>
<output>
<body xmlns="http://schemas.xmlsoap.org/wsdl/soap/" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:SiteCentercobIntf-ISiteCentercob"/>
</output>
</operation>
<operation name="CadastrarCliente">
<operation xmlns="http://schemas.xmlsoap.org/wsdl/soap/" soapAction="urn:SiteCentercobIntf-ISiteCentercob#CadastrarCliente" style="rpc"/>
<input>
<body xmlns="http://schemas.xmlsoap.org/wsdl/soap/" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:SiteCentercobIntf-ISiteCentercob"/>
</input>
<output>
<body xmlns="http://schemas.xmlsoap.org/wsdl/soap/" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:SiteCentercobIntf-ISiteCentercob"/>
</output>
</operation>
</binding>
<service name="ISiteCentercobservice">
<port name="ISiteCentercobPort" binding="tns:ISiteCentercobbinding">
<address xmlns="http://schemas.xmlsoap.org/wsdl/soap/" location="http://localhost:8080/soap/ISiteCentercob"/>
</port>
</service>
</definitions>Evandro Oliveira, obrigado pela atenção.
Eu fiz o debug que você comentou e ele realmente mostrou todos as funções do WebService.
Eu gostaria que você me tirasse uma outra dúvida (se for possível).
Ontem devido a esse problema de não conseguir passar um TIPO de dados por parâmetro, eu resolvi então, pegar a função CadastrarCliente(TCliente cliente), e alterar o parâmetro para:
Como pode ser visto, eu ao invés de utilizar o TCliente (que eu havia criado) coloquei todos os parâmetros que iria precisar para um cadastro de cliente. Adivinha .... Não deu certo.
Eu fiz um outro teste então, e diminui o numero de parâmetros (para 2 e posteriormente para 4 parâmetros), e consegui executar a função sem erros. Tentei então aumentar o numero de parâmetros novamente, para que fosse possível ter todos os dados necessários para o cadastro, e voltou a ter erros.
Existe um número limite de parâmetros que posso utilizar na funções ?
O Ideial para este caso, é que eu consegui-se utilizar um tipo de de dados ou mesmo um array de valores, para que eu pudesse evitar esse numero grande de parâmetros em minha função.
Voce teria alguma alternativa para isso ?
Obrigado.
No PHP, não existe um limite. Inclusive, existem funções que te permitem passar N parâmetros.
A melhor alternativa é como se estava fazendo, um tipo complexo. Não domino muito XSDL, mas tinha funcionado com o seu primeiro exemplo.
Nas buscas que fiz para tentar encontrar problemas parecidos, a solução sempre vinha especificando o namespace antes do tipo
<ns1:element>...</ns1:element>
Acabei de criar uma nova pasta, com dois arquivos
service.xml: Contendo sua definição do webservice (cópia e cola)
client.php:
<?php
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient('./service.xml');
print_r($client->__getFunctions());
E a saída
Array
(
[0] => TResultado VerificarUsuario(string $login)
[1] => TResultado VerificarCpfCnpj(string $tipoPessoa, string $cnpjCpf)
[2] => TResultado CadastrarCliente(TCliente $cliente)
)
Alterando [inline]<complexType>[/inline] para [inline]<ns1:complexType>...</ns1:complexType>[/inline], a saída também foi satisfatória.
Alterando a URL do webservice (veja que, no teste, utilizei o caminho relativo ao script atual) para
$client = new SoapClient('http://localhost/.../service.xml');Também obtive uma resposta satisfatória.
Atente-se, também, de salvar os dois arquivos sob codificação UTF-8.
Obrigado pela dicas, consegui passar o parâmetro com o tipo de dados que criei (TCliente) com sucesso, e o retorno também.
Obrigado.
Não sei explicar o que houve. Copiei e colei o seu xsdl. Na primeira vez, o tipo veio como UNKNOWN. Apenas tirei os parâmetros do complexType:TCliente e adicionei novamente. Tudo OK.
Apaguei o xml e colei o conteúdo aqui do fórum denovo e tudo deu OK.
Sugiro que tente fazer o debug com [inline]var_dump($client->__getFunctions());[/inline]. Modifique o WSDL até conseguir alguma alteração. Depois disso, tente reescrever os parâmetros de cadastrarCliente.
De fato está tudo correto com a definição do WS.