chesterduh Posted July 5, 2012 at 06:31 PM Report Share #467532 Posted July 5, 2012 at 06:31 PM 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 More sharing options...
chesterduh Posted July 5, 2012 at 06:47 PM Author Report Share #467533 Posted July 5, 2012 at 06:47 PM 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 More sharing options...
HappyHippyHippo Posted July 5, 2012 at 08:08 PM Report Share #467546 Posted July 5, 2012 at 08:08 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
chesterduh Posted July 5, 2012 at 09:20 PM Author Report Share #467558 Posted July 5, 2012 at 09:20 PM (edited) 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 July 5, 2012 at 09:23 PM by chesterduh Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 5, 2012 at 09:40 PM Report Share #467564 Posted July 5, 2012 at 09:40 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
chesterduh Posted July 5, 2012 at 10:20 PM Author Report Share #467573 Posted July 5, 2012 at 10:20 PM 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 More sharing options...
HappyHippyHippo Posted July 5, 2012 at 10:51 PM Report Share #467579 Posted July 5, 2012 at 10:51 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
taviroquai Posted July 5, 2012 at 11:24 PM Report Share #467581 Posted July 5, 2012 at 11:24 PM 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 More sharing options...
HappyHippyHippo Posted July 5, 2012 at 11:32 PM Report Share #467583 Posted July 5, 2012 at 11:32 PM @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 Portugol Plus Link to comment Share on other sites More sharing options...
taviroquai Posted July 6, 2012 at 04:26 PM Report Share #467728 Posted July 6, 2012 at 04:26 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now