Enviar XML via POST

30/11/2012

0

Olá Pessoal.

Estou tendo dificuldade em enviar um xml via post. O servidor sempre me da resposta que não foi enviado nenhum arquivo.
Abaixo segue exemplo de como estou fazendo:

//Gerando o XML
XMLEnvio.AddChild('Produtos');
XMLEnvio.DocumentElement.ChildNodes['Produto'].AddChild('referencia').NodeValue := '120';
XMLEnvio.DocumentElement.ChildNodes['Produto'].AddChild('qtd_estqoue').NodeValue := 50;
//Enviar XML
idHTTP.Request.ContentType := 'text/xml';
IdHTTP.Post('http://www.teste.com.br/xml/atualizacao_estoque.php', XMLEnvio.XML, Resposta);

Ele sempre me retorna que não foi enviado arquivo.

Já tentei trocar o XMLEnvio.XML por: caminho e nome do arquivo xml salvo, TStringList, TStringStream e TFileStream ambos ocorrem mesma coisa.

Alguma ideia?
Samuel Basso

Samuel Basso

Responder

Post mais votado

02/12/2012

Com base nesse form de exemplo que você postou, chego a conclusão que se simularmos o envio de um form com enctype="multipart/form-data" com um input type= file com name=xml vamos conseguir.
Fiz uns testes em localhost e consegui chegar no seguinte código:

Adicione IdMultipartFormData e XmlDoc nos uses do form.

Var
  Response: TStringStream;
  Arquivo: TIdMultipartFormDataStream;
  XMLEnvio : TXMLDocument;
begin
  XMLEnvio := TXMLDocument.Create(Nil);
  XMLEnvio.Active := True;
  XMLEnvio.AddChild('Produtos');
  XMLEnvio.DocumentElement.ChildNodes['Produto'].AddChild('referencia').NodeValue := '120';
  XMLEnvio.DocumentElement.ChildNodes['Produto'].AddChild('qtd_estqoue').NodeValue := 50;
  XMLEnvio.SaveToFile('c:\temp.xml');
  Response := TStringStream.Create('');
  Arquivo := TIdMultiPartFormDataStream.Create;
  Arquivo.AddFile('xml', 'c:\temp.xml', 'xml/text');
  IdHTTP.Request.CustomHeaders.Clear;
  IdHTTP.Request.Clear;
  IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
  IdHTTP.Request.ContentEncoding := 'multipart/form-data';
  IdHTTP.Request.Referer := 'http://www.testetestecom.br/xml/atualizacao_estoque.php';
  IdHTTP.Post('http://www.testetestecom.br/xml/atualizacao_estoque.php', Arquivo, Response);
  ShowMessage(Response.DataString);
end;

Claudia Nogueira

Claudia Nogueira
Responder

Mais Posts

30/11/2012

Claudia Nogueira

O que tem no arquivo atualizacao_estoque.php?
E qual a mensagem exata de retorno?
Responder

01/12/2012

Samuel Basso

O arquivo PHP não tenho, pois é outra empresa que desenvolveu, porém o arquivo que gero xml se mandar manualmente por uma página que eles criaram funciona, mas direto via post no delphi não.

<div>
<form action="http://www.testetestecom.br/xml/atualizacao_estoque.php" method="post" enctype="multipart/form-data" name="0.1_form1" target="_blank" onsubmit="return window.confirm("You are submitting information to an external page.\nAre you sure?");">
<input type="file" name="xml">
<br>
<br>
<input type="submit" name="button" value="Enviar">
</form>
</div>
</body></html>

Se eu executar isso no navegador, escolher o arquivo xml e enviar funciona. E como falei utilizando o POST e o mesmo endereço não está funcionando.

Não sei se consegui ser claro.
Responder

03/12/2012

Samuel Basso

Perfeito funcionou. Muito obrigado.

Só para eu entender, a diferença foi na utilização do TIdMultiPartFormDataStream ?? Pois tentei como falei com TString, Stream, FileStream, e nenhum deles consegui. Agora com sua dica funcionou perfeitamente.

Mais uma vez muito obrigado.
Responder

03/12/2012

Claudia Nogueira

A diferença foi o TIdMultiPartFormDataStream mesmo. Somente assim pra digamos assim, enviar um arquivo. Que bom que funcionou.

Perfeito funcionou. Muito obrigado.

Só para eu entender, a diferença foi na utilização do TIdMultiPartFormDataStream ?? Pois tentei como falei com TString, Stream, FileStream, e nenhum deles consegui. Agora com sua dica funcionou perfeitamente.

Mais uma vez muito obrigado.
Responder

07/06/2015

Alexandre

Sou programador delphi de um hotel e me deram a tarefa de integrar um servico de reservas on-line com
O meu programa que roda aqui no hotel.

Tenho de consumir um web-service da seguinte maneira:

Tenho de enviar um xml para eles e eles me retornam outro com os dados que precisso, ou seja
O xml que envio tem username,senha,idhotel e periodos
O xml que eles retornam tem todas as reservas que foram feitas la no site de reservas deles Ou seja hoje funciona assim:

- hoje o funcionario de reservas entra no site das reservas on-line, imprimi todas as reservas e digita no meu programa

Depois da implantacao do (Consumir web-service) e pra ficar assim:

- terei uma aplicacao delphi minimizada que ficara a cada 5 minutos enviando um xml e recebendo outro
E quando receber automaticamente incluirar as reservas no meu programa.

-AGORA O PROBLEMA:

Já faz uma semana que quase não durmo e não consigo enviar um arquivo xml ou as linhas do xml para o web-service
E receber o xml de volta. Já fiz de tudo idhttp, httprio, etc, etc.

O pessoal do web-service dispobibilizou o WSDL os manuais e tudo mais, mas mesmo assim não consigo.

VOCE PODE ME AJUDAR, SO PRECISO ENVIAR E RECEBER, SO QUERO O REQUEST E O RESPONSE O RESTO EU FAÇO.
VOCE PODE ME COBRAR PELA AJUDA, POIS SE EU NÃO CONSEGUIR PERDEREI MEU EMPREGO E SO TENHO MAIS DOIS DIAS.

ALEXANDRE PESSOA
alexandre@pesistemas.com.br
solucoeshotel@hotmail.com
81 9615-2319

GEREI ESTE XML, ENVIEI PARA O PESSOAL DO WEB SERVICE E ME FALARAM QUE ESTAVA CERTINHO, SO NÃO SEI ENVIAR.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="XmlServices">
<soapenv:Header/>
<soapenv:Body>
<xs:GetOrders>
<xs:request>
<xs:Credentials>
<xs:UserName>rob2@rob.pl</xs:UserName>
<xs:Password>tester101</xs:Password>
<xs:HotelId>3</xs:HotelId>
</xs:Credentials>
<xs:SubmittedSince>2010/01/01</xs:SubmittedSince>
<xs:SubmittedTill>2015/06/01</xs:SubmittedTill>
<xs:StatusChangedSince>2010/01/01</xs:StatusChangedSince>
<xs:StatusChangedTill>2015/06/01</xs:StatusChangedTill>
<xs:ArrivalSince>2010/01/01</xs:ArrivalSince>
<xs:ArrivalTill>2015/06/01</xs:ArrivalTill>
</xs:request>
</xs:GetOrders>
</soapenv:Body>
</soapenv:Envelope>

ME RETORNAM ESTA TELA ABAIXO FALANO QUE ESTAVA OK


Olá Alexandre

Realizei um teste e funciona corretamente, verifique:

REQUEST:
URL: http://hoteltool.yieldplanet.com/XmlServices/ChannelManager.asmx?WSDL

Host: hoteltool.yieldplanet.com
Content-Type: text/xml; charset=utf-8
SOAPAction: "XmlServices/GetOrders"
Content-Length: 804

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetOrders xmlns="XmlServices">
<request>
<Credentials>
<UserName>rob2@rob.pl</UserName>
<Password>tester101</Password>
<HotelId>3</HotelId>
</Credentials>
<SubmittedSince>2010-01-01</SubmittedSince>
<SubmittedTill>2015-06-01</SubmittedTill>
<StatusChangedSince>2010-01-01</StatusChangedSince>
<StatusChangedTill>2015-06-01</StatusChangedTill>
<ArrivalSince>2010-01-01</ArrivalSince>
<ArrivalTill>2015-06-01</ArrivalTill>
</request>
</GetOrders>
</soap:Body>
</soap:Envelope>

RESPONSE:
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 05 Jun 2015 15:35:18 GMT
Content-Length: 159372



Por favor verifique se em vosso código está tudo igual ao descrito acima, também podes encontrar como realizar o request no link abaixo:

http://hoteltool.yieldplanet.com/XmlServices/ChannelManager.asmx
Responder

15/06/2016

Elvys

Ola Alexandre, estou com a mesma dificuldade. Tenho um link wsdl, fiz o import da estrutura. Porem não sei como faço para enviar o xml direto via webservice.
Não quero passar os parametros dos metodos do wsdl. Gostaria de enviar o xml já criado direto. Igual o seu que já tem um xml envelope criado.

É possível?

Teve algum sucesso?
Responder

20/06/2016

Gabriel Baltazar

Fiz isso recentemente. Vai no BeforeExecute do seu HttpRio e altera o SoapRequest com o xml que quer enviar
Responder

24/09/2016

Dirceu Morais

Gente estou precisando de um favor, dê uma olhadinha em um destes link:

Consumir Webservice

e/ou neste

devmedia.com.br/forum/ancine-sistema-de-controle-de-bilheteria/562393


Estou precisando consumir uma webservice e estou tendo dificuldades.

Desde já agradeço
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar