Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Fala galera,
Beleza?
Estou tentando mandar um array de objetos de um servidor soap para o cliente e não está dando certo. Consigo enviar normalmente se passar uma string, ou um inteiro, até mesmo um array simples. A comunicação está normal. Mas quando tento passar um array de objetos, serializando-a, chega nulo do outro lado.
No final das contas o que fiz fica mais ou menos assim:
function listaTudo($opcoes = array()){
//essa variavel $usuarios é um array com varios objetos do tipo usuario
$listaUsuarios = serialize($usuarios);
$retorno = array("resposta"=>"OK", "mensagem"=>"listagem feita com sucesso", "usuarios"=>$listaUsuarios);
return array($retorno);
}
No lado cliente estou pegando assim:
$resposta = $c->call('UsuarioService.listaTudo', array(
array(
'nome_tabela' => 'usuarios'
)
));
O $resposta tá vindo nulo. Mas se eu remover o terceiro item do array $retorno que leva o array serializado o que script funciona normalmente. O problema é claramente o jeito que estou tentando enviar a lista de objetos. Como nunca criei um servidor e um cliente soap antes tá tenso achar uma solução.
Alguma dica?
Obrigado,
Abs
Como está o seu WSDL? Lembrando que para o retorno, um objeto serializado é considerado uma string e não um array/objeto.
A variável $usuarios é criada dentro da função que chamo pelo cliente. Ela faz uma busca no banco de dados de todos os usuários de uma tabela guarda seus valores em objetos e esse objetos eu vou colocando dentro da $usuarios. Está sendo criada normalmente. Está tudo redondo. Menos a chegada do meu array de objetos do outro lado.
No meu controller eu criei um o seguinte pro servidor:
$server = new soap_server();
$server->configureWSDL("Nome projeto", false, '/soap/usuarios?wsdl');
$server->decode_utf8 = true;
$server->wsdl->addComplexType(
'common_array', 'complexType', 'array', 'all', '', array(
'fieldname' => array('name' => 'fieldname', 'type' => 'xsd:string'),
)
);
$server->wsdl->addComplexType('usuario', 'complexType', 'struct', 'all', '', array(
'id' => array('name' => 'id', 'type' => 'xsd:string'),
'email' => array('name' => 'email', 'type' => 'xsd:string'),
'perfil_id' => array('name' => 'perfil_id', 'type' => 'xsd:string'),
'funcao_id' => array('name' => 'funcao_id', 'type' => 'xsd:string'),
'senha' => array('name' => 'senha', 'type' => 'xsd:string'),
'data_ultimo_acesso' => array('data_ultimo_acesso' => 'senha', 'type' => 'xsd:string')
)
);
$server->wsdl->addComplexType(
'usuarioArray', 'complexType', 'array', '', 'SOAP-ENC:Array', array(), array(
array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:usuario[]')
), 'tns:usuario'
);
No cliente estou tentando isso:
$usuarioService = new UsuarioService();
$opcoes = array("nome_tabela"=>"usuarios");
$retorno = $usuarioService->listaTudo($opcoes);
var_dump($retorno[0]['usuarioArray']);
Não sei se criei os tipos complexos corretamente. Achei uma página aqui no google que tinha algo parecido e tentei adaptar. O var_dump do cliente traz o OK e a mensagem de sucesso. Mas não traz o array com os objetos. Ele vem vazio. Alguma idéia?
abs
A não ser que esteja usando uma versão muito antiga do PHP, passe a utilizar PHP::SOAP.
Além do mais, a forma que você mapeou o usuário e a forma que está retornando ele são completamente distintas.
Como eu comentei ateriormente, serialize significa apenas uma string que representa o objeto. Já na definição, você separou cada campo (id, email, perfil_id, etc...).
Ou você muda a forma que está retornando o usuário, ou mude a definição do complex type de usuário.
Obs.: Adicione seus códigos com a tag code.
Fala Gabriel,
Eu acabei retornando um array. Não consegui achar uma forma de retornar o objeto aí eu montei o array com os campos que eu queria vindo do objeto. Enquanto não encontro outra solução vou ter que deixar assim mesmo.
Obrigado pela ajuda pessoal. Qualquer novidade venho aqui atualizar.
Na realidade, você não pode retornar um objeto. Você apenas pode mapeá-lo (tanto no server quanto no cliente) para que o PHP em si monte o objeto. No mais, você só pode utilizar de dados simples e do complexType (que basicamente é um conjunto de dados).
Essa é a lista de dados permitidos no WSDL.
Você não passa essa variável $usuarios como um argumento da função? ou ela é uma variável global?, caso não seja você deve passala como argumento da função ...