Jump to content

Webservice request e xml


chesterduh

Recommended Posts

Boa tarde a todos!

Tenho um webservice que me pede 3 parâmetros no request: user (string), password (string) e data (xml), e não consigo obter qualquer tipo de resposta, sempre os mesmos erros:

"Fatal error: Uncaught SoapFault exception: [a:InternalServiceFault] The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs. in...blablabla"

código:

<?php
$client = new SoapClient('http:/blahblahblah.svc?wsdl');
$xml_file = file_get_contents('opencall.xml');
$parameters = array('u' => 'user', 'p' => 'password', 'd' => $xml_file);
$wcf = $client->interfaceDeccare_AbreChamada($parameters);

foreach ($wcf as $value) {
print_r($value);
}
?>

ou então este:

"Fatal error: SOAP-ERROR: Encoding: object has no 'any' property in...blablabla"

código:

<?php
$client = new SoapClient('http:/blahblahblah.svc?wsdl');
$xml_file = file_get_contents('opencall.xml');
$xmlvar = new SoapVar(
		'<xs:xmlDocument>'.$xml_file.'</xs:xmlDocument>',
		XSD_ANYXML
);
$xml->xmlDocument = (object)$xmlvar;
$parameters = array('u' => 'user', 'p' => 'password', 'd' => $xml);
$wcf = $client->interfaceDeccare_AbreChamada($parameters);
foreach ($wcf as $value) {
print_r($value);
}
?>

Sei que o webservice está a funcionar direitinho e que o problema estará da minha parte, muito provavelmente na forma como envio o soap envelope.

Alguém me dá algumas luzes sobre a melhor forma de enviar um xml num request a um webservice através do SOAP? Estou farto the googlar e não encontro nada que vá de encontro ao que eu preciso..

Qualquer tipo de ajuda é muito benvinda!

Obrigado,

Flávio A.

Link to comment
Share on other sites

Se ajudar o schema da função interfaceDeccare_AbreChamada é este:

<xs:element name="interfaceDeccare_AbreChamada">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="u" type="xs:string"/>
<xs:element minOccurs="0" maxOccurs="1" name="p" type="xs:string"/>
<xs:element minOccurs="0" maxOccurs="1" name="d">
<xs:complexType mixed="true">
<xs:sequence>
<xs:any/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="interfaceDeccare_AbreChamadaResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="interfaceDeccare_AbreChamadaResult">
<xs:complexType mixed="true">
<xs:sequence>
<xs:any/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

e o ficheiro xml será este:

<?xml version="1.0" encoding="iso-8859-1"?>
<EXTENSAOGARANTIA xmlns="">
 <PEDIDO>
<CLIENTE>
  <ID/>
  <NIF/>
  <NOME/>
  <CONTACTO/>
  <RUA/>
  <NRPORTA/>
  <LOCALIDADE/>
  <CODIGOPOSTAL/>
  <PAIS/>
  <OBS/>
  <CONTACTOSCLIENTE>
	<TIPOCONTACTO/>
	<VALOR/>
  </CONTACTOSCLIENTE>
  <CONTACTOSCLIENTE>
	<TIPOCONTACTO/>
	<VALOR/>
  </CONTACTOSCLIENTE>
</CLIENTE>
<EQUIPAMENTO>
  <NUMERODESERIE/>
  <MARCA/>
  <MODELO/>
  <DESCRICAO/>
  <ESTADOEQUIPAMENTO/>
</EQUIPAMENTO>
 </PEDIDO>
 <RESPOSTA>
<CHAMADA/>
<PDF/>
<ERROS/>
 </RESPOSTA>
</EXTENSAOGARANTIA>

que será depois preenchido com determinados valores antes de enviar ao web service.

Mais uma vez agradeço qualquer ajuda ou orientação,

Flávio A.

Link to comment
Share on other sites

o teu problema pode advir de duas situações distintas, mas primeiro aconselho a fazer esta alteração no código para se poder detectar qual delas:

try {
 $client = new SoapClient('http:/blahblahblah.svc?wsdl', array("trace" => 1)); // "ligar" o debug
 $xml_file = file_get_contents('opencall.xml');
 $parameters = array('u' => 'user', 'p' => 'password', 'd' => $xml_file);  $wcf = $client->interfaceDeccare_AbreChamada($parameters);
 // o resto do código
}catch(SoapFault $fault){ 
 echo 'Request : <br/><xmp>', 
 $client->__getLastRequest(), 
 '</xmp><br/><br/> Error Message : <br/>', 
 $fault->getMessage(); 
} 

Agora, o problema pode estar na maneira como a classe SoapClient trata a informação disponibilizada. Lembra-te que o pedido é feito com XML, e o conteúdo de uma tag é XML, irá confundir o servidor que receberá a mensagem.

O que se faz para culmatar este tipo de situações é uma de duas:

- é envolvido os dados em tags "<![CDATA[" ... "]]>"

- os elementos reservados do XML são convertidos ('<', '/', '>' e o '&') em entities no conteúdo XML

Para determinar se e qual das duas ações o SoapClient efetua, basta alterares o código descrito acima e verificares o XML do pedido.

Muito mais não posso dizer porque eu uso o NuSoap, e que normalmente codifico a segunda opção descrita como solução para este tipo de problemas.

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Boas Hippo,

Desde já agradeço imenso a tua resposta!

Alterei o código como me indicaste e tanto com CDATA como sem, o resultado é o seguinte:

Request :

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"><SOAP-ENV:Body><ns1:interfaceDeccare_AbreChamada><ns1:u>user</ns1:u><ns1:p>password</ns1:p><ns1:d/></ns1:interfaceDeccare_AbreChamada></SOAP-ENV:Body></SOAP-ENV:Envelope>

Error Message :

The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.

Reparei que o parametro "d" (o xml) vai sempre vazio...

O que achas que estará a acontecer?

Com o NuSoap como farias para enviar o request?

Já agora, eu no cabeçalho do xml tenho o encoding="iso-8859-1" (por causa dos caracteres especiais), no entanto o envelope está a ser enviado com o encoding="UTF-8"... Porque será?

Muito obrigado,

Flávio

Edited by chesterduh
Link to comment
Share on other sites

como te disse, como não uso esse módulo, não te posso dar respostas concretas, no entanto podes verificar estas situações:

- como o campo "d" vai sempre vazio, temos de ver nas três instruções do código

$xml_file = file_get_contents('opencall.xml');
$parameters = array('u' => 'user', 'p' => 'password', 'd' => $xml_file);
$wcf = $client->interfaceDeccare_AbreChamada($parameters);

na primeira instrução, tens de verificar se o o ficheiro foi corretamente lido. como é descrito na documentação, terás de verificar se o resultado da função é o valor "falso".

if (($xml_file = file_get_contents('opencall.xml')) === false) {
 die("Erro de leitura do ficheiro XML");
}

na segunda instrução não parece haver nenhum problema.

resta então a terceira instrução.

no entanto, a excepção criada não é originada na criação do pedido, isto porque pelas mensagens que apresentas, parece que o problema é detectado na leitura do lado do servidor. mas não deves acreditar em tudo que se lê 😄 , até porque não sei como essa classe funciona e não sei qual o nível de output de erro que tens configurado.

para eliminar esta possibilidade adiciona as seguintes duas linhas no início do teu script para ver se existe algum output de erro por parte dessa classe que não vias até agora:

error_reporting(E_ALL);
ini_set('display_errors', '1');

para resolver o teu problema de encoding adiciona o seguinte parâmetro na criação da classe

$client = new SoapClient('http:/blahblahblah.svc?wsdl', array("trace" => 1, 'encoding'=>'ISO-8859-1'))
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Obrigado Hippo, tens sido uma valente ajuda!! 👍

já consegui mais alguma coisa...

o seguinte código:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
try {
 $client = new SoapClient('http:/blahblahblah.svc?wsdl', array("trace" => 1, "encoding"=>'ISO-8859-1')); // "ligar" o debug
 if (($xml_file = file_get_contents('opencall.xml')) === false) {
 die("Erro de leitura do ficheiro XML");
}
 $xml_enc = "<![CDATA[".$xml_file."]]>";
 $xml = new SoapVar($xml_enc, XSD_ANYXML, 'interfaceDeccare_AbreChamada', 'http://tempuri.org/');
 $parameters = array('u' => 'user', 'p' => 'password', 'd' => $xml);
 $wcf = $client->interfaceDeccare_AbreChamada($parameters);
 // o resto do código
}catch(SoapFault $fault){
 echo 'Request : <br/><xmp>',
 $client->__getLastRequest(),
 '</xmp><br/><br/> Error Message : <br/>',
 $fault->getMessage();
}
?>

já gera o seguinte:

Request :

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Body><ns1:interfaceDeccare_AbreChamada><ns1:u>user</ns1:u><ns1:p>password</ns1:p><![CDATA[<?xml version="1.0" encoding="iso-8859-1"?>
<EXTENSAOGARANTIA xmlns="">
<PEDIDO>
<CLIENTE>
 <ID />
 <NIF>234567890</NIF>
 <NOME>FLAVIO ALVES</NOME>
 <CONTACTO>FLAVIO ALVES</CONTACTO>
 <RUA>RUA DE CIMA</RUA>
 <NRPORTA>999</NRPORTA>
 <LOCALIDADE>PORTO</LOCALIDADE>
 <CODIGOPOSTAL>4100-000</CODIGOPOSTAL>
 <PAIS>PT</PAIS>
 <OBS />
 <CONTACTOSCLIENTE>
 <TIPOCONTACTO>EmailAddress</TIPOCONTACTO>
 <VALOR>FLAVIO.ALVES@BLABLA.PT</VALOR>
 </CONTACTOSCLIENTE>
 <CONTACTOSCLIENTE>
 <TIPOCONTACTO>TelephoneNumber</TIPOCONTACTO>
 <VALOR>912345678</VALOR>
 </CONTACTOSCLIENTE>
</CLIENTE>
<EQUIPAMENTO>
 <NUMERODESERIE>LX12345678910111213141</NUMERODESERIE>
 <MARCA>1</MARCA>
 <MODELO>ASPIRE</MODELO>
 <DESCRICAO>DESKTOP</DESCRICAO>
 <ESTADOEQUIPAMENTO>OK</ESTADOEQUIPAMENTO>
</EQUIPAMENTO>
</PEDIDO>
<RESPOSTA>
<CHAMADA />
<PDF />
<ERROS />
</RESPOSTA>
</EXTENSAOGARANTIA>]]></ns1:interfaceDeccare_AbreChamada></SOAP-ENV:Body></SOAP-ENV:Envelope>

Error Message :

The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.

o xml já vai no envelope, mas parece-me que não vai identificado como pertencendo ao parâmetro "d", além que lá no meio aparece o "<![CDATA[]]>", não sei se é normal... O erro continua o mesmo, e continua a enviar o envelope codificado em UTF-8 😕

Vou continuar com os testes, mas o certo é que já estou farto deste imbróglio... 😞

Link to comment
Share on other sites

estive a ver a documentação, experimenta somente assim:

//  $xml_enc = "<![CDATA[".$xml_file."]]>";
//  $xml = new SoapVar($xml_enc, XSD_ANYXML, 'interfaceDeccare_AbreChamada', 'http://tempuri.org/');
//  $parameters = array('u' => 'user', 'p' => 'password', 'd' => $xml);
$parameters = array('u' => 'user', 'p' => 'password', 'd' => new SoapVar($xml_file, XSD_ANYXML));
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Error Message :

The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.

Recordo-me que foi por causa de esse tipo de configuração (má configuração) do serviço no servidor que também passei uns bons dias a andar "à cabeçada" com um webservice desses...

Quem te fornece o webservice deve-te fornecer documentação em condições para "à primeira" saberes criar um pedido válido sem teres que andar às apalpadelas com isso...

Link to comment
Share on other sites

@taviroquai : sim, mas ele disse que o servidor está a funcionar corretamente

Sei que o webservice está a funcionar direitinho e que o problema estará da minha parte, muito provavelmente na forma como envio o soap envelope.

além disso, já foi verifica que o problema é mesmo na criação do pedido

Reparei que o parametro "d" (o xml) vai sempre vazio...

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Quem te fornece o webservice deve-te fornecer documentação em condições para "à primeira" saberes criar um pedido válido sem teres que andar às apalpadelas com isso...

Pelos vistos ele não recebeu documentação em condições senão não teria tantos problemas a criar um pedido válido; na documentação devem fornecer um exemplo de um pedido válido que inclua o XML Soap e como é o envelop, no campo data.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.