Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

falcondef

Consumindo WebService

Recommended Posts

Olá Amigos:

 

 

Tenho um WebService (soap) para testes, e estou construindo uma função para cadastrar um cliente:

 

  • function CadastrarCliente(cliente : TCliente): TResultado.

 

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>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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:

 

  • CadastrarCliente(String razaoSocial, String fantasia, String cnpj,String inscricaoEst,Char tipoPessoa, String logradouro,String numero,String bairro, String cidade)

 

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.