Ir para conteúdo

Arquivado

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

Ederson Silva

Comunicação webservice de XML fora do padrão

Recommended Posts

Olá Pessoal.

 

Novamente estou desenvolvendo mais uma integração com um fornecedor de minha empresa, porém encontrei um problema.

 

No desenvolvimento da integração anterior, a criação do xml utilizando o protocolo SOAP era no formato normal, conhecido pelo menos por mim, por exemplo:

 

Para gerar o xml

<pessoaFisica><cpf><numero>1234567899900</numero></cpf></pessoaFisica>

eu só precisava criar um array no seguinte formato:

array('pessoaFisica'=>   array('cpf'=>      array(        'numero'=>'1234567899900'      )   ));

Porém o padrão do xml desse novo fornecedor é diferente, nesse caso ficaria assim:

<pessoaFisica><cpf numero="1234567899900" /></pessoaFisica>

Nesse caso, se eu mandar o array como mostrei em cima, o webservice me retorna um erro, dizendo que não estou informando os parâmetros corretamente, e não encontrei nada na internet que utilizasse um xml nesse formato.

 

Alguém já desenvolveu algo assim em PHP?

 

Falows

 

 

Alguém se habilita? heheheeh

Compartilhar este post


Link para o post
Compartilhar em outros sites

posso estar errado, mas se você vai enviar o xml para o webservice por que não gerar este xml usando a class DOMDocument ?

 

  $doc = '05625636958';
  $xml = new DOMDocument('1.0', 'UTF-8');
  $xml->preserveWhiteSpace = false;
  $xml->formatOutput       = false;
  
  $pessoaFisica = $xml->createElement('pessoaFisica');
  $cpf          = $xml->createElement('cpf');
  $cpf->setAttribute('numero', $doc);
  
  $pessoaFisica->appendChild($cpf);  
  $xml->appendChild($pessoaFisica);
  
  $xml->save('pessoaFisica.xml');

Compartilhar este post


Link para o post
Compartilhar em outros sites

E como eu realizaria o envio para o webservice através do soap? Pois hoje faço da seguinte forma:

 

$argumentos = array('pessoaFisica'=> array('cpf'=> array( 'numero'=>'1234567899900' ) ) );
$local = new SoapClient('endereco_do_webservice.asmx?wsdl',array('soap_version'   => SOAP_1_2));
$resultado = $local->__soapCall('GetCli', $argumentos);
print_r($resultado);

 

Já tentei colocar ali em argumentos o próprio xml, só que a função pede um array e acaba com erro, vc tem algum exemplo utilizando esse formato que vc me passou para eu tentar aprender?
Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei como funciona a arquitetura do webservice em questão, por isso posso estar errado. Mas geralmente passamos os argumentos em forma de array e o nusop transforma isso em xml. Porém pode-se passar o xml diretamente:

$client->send($xml_string, $action) 

Nunca consumi um webservice usando a extensão nativa do php, então não sei se consigo dar-lhe uma informação precisa. Mas encontrei este post talvez de uma luz:

 

http://stackoverflow.com/questions/19009554/php-soapclient-send-custom-xml

 

há ainda a possibilidade de enviar a solicitação usando cURL também é uma saída.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade meu problema maior mesmo é o envio via webservice, não consigo utilizar o cURL aqui pq meu servidor é antigo, tentei instalar e deu um monte de problema, até tenho um servidor novo pra migrar mas demora um pouco.

 

Referente a geração da string do xml, até faço no braço, sem problemas, mas como enviar via SOAP ou algum outro protocolo, desde que não seja o tal do cURL, haheheheua...to passando trabalho aqui, em Java eu sei que tem solução, agora em php nunca vi.

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se puder passar o modelo SOAP request do webservice (Se ele existir é claro)rsrs eu posso ajudar. Já tentou usar StdClass ao invés de array ?

 

$url = '';
$local = new SoapClient($url);

$xml = new SimpleXMLElement("<pessoaFisica></pessoaFisica>");
$cpf = $xml->addChild('cpf');
$cpf->addAttribute('numero', '12345678900');

$params = new stdClass();
$params->xml = $xml->asXML();


var_dump($params);
$resultado = $local->__soapCall('GetCli', $params);
print_r($resultado);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Ademilson Nunes

 

Estou instalando um novo servidor para trabalhar simultâneo, pois meu servidor atual tem a versão do php 5.1.2, muitas dessas dicas que você passou não estão contempladas nessa versão do php, e ainda nem posso instalar uma nova versão porque o sistema foi todo desenvolvido nessa versão e precisa ter o register globals, o que me quebrou...rsrsrsrs....

Quando terminar a instalação vou fazer algumas requisições nesse novo servidor processar e retornar com um json da vida pra conseguir trabalhar melhor.

 

Quando tiver tudo pronto retorno aqui e digo se funcionou ou não.

 

Té mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descobri como fazer isso, na verdade é muito simples, basta criar a string do xml e converter ele em array, fica assim:

 

$xml = '<pessoaFisica><cpf numero="123456799900" /></pessoaFisica>';
        $conversao = simplexml_load_string($xml);
        $xmlfinal = json_decode(json_encode($conversao), true);
        $soap = new SoapClient('http://endereco_do_wsdl?wsdl',array('soap_version'   => SOAP_1_2));
        $retorno = $soap->__soapCall('ConsultarCliente', $xmlfinal);

Falows

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.