Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-10-2015
vicvil vicvil is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 157
Poder: 22
vicvil Va por buen camino
Dudas con IdHTTP de Indy 9

Hola buenas, tengo que enviar un archivo xml a un webservices y estoy usando los componentes Indy.

Para ello utilizo el IdHHTP, pero aquí es donde tengo algunas dudas.

El ejemplo que hay a continuación es el archivo que debería recibir el webservices, lo que está marcado en rojo corresponde al Header. Y es aquí donde tengo las dudas y es ¿cómo puedo hacer para indicar lo de la primera línea? es decir, que en el encabezado aparezca "POST /cgi_dte/UPL/DTEUpload HTTP/1.0"

La línea que dice "Cookie" tengo que ingresar un token que me entrega el webservice a traves de otro proceso, ese token ya lo tengo, pero ¿cómo lo ingreso en el encabezado?

Y la última pregunta es sobre el Boundary=7d23e2a11301c4. ¿Qué es específicamente ese boundary? y ¿de donde se saca esos caractéres?

Código:
POST /cgi_dte/UPL/DTEUpload HTTP/1.0^M
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/vnd.ms-powerpoint, application/ms-excel,
application/msword, */*^M
Referer: {URL que referencia a upload Ej.
http://empresaabc.cl/test.html}^M
Accept-Language: es-cl^M
Content-Type: multipart/form-data: boundary={boundary data: Ej. ------
---------------------7d23e2a11301c4}^M
Accept-Encoding: gzip, deflate^M
User-Agent: Mozilla/4.0 (compatible; PROG 1.0; Windows NT 5.0; YComp
5.0.2.4)^M
Host: {Host Id. Ej: https://maullin.sii.cl}^M
Content-Length: {largo total de mensaje sin Req. Header. Ej.: 10240}^M
Connection: Keep-Alive^M
Cache-Control: no-cache^M
Cookie: TOKEN={Entregado por Autenticación. Ej.: YZD0II2ApZjlM}^M
^M[/color]
{Comienzo de Multipart/Form-data}
-----------------------------7d23e2a11301c4^M
Content-Disposition: form-data; name="rutSender"^M
^M
1^M
-----------------------------7d23e2a11301c4^M
Content-Disposition: form-data; name="dvSender"^M
^M
9^M
-----------------------------7d23e2a11301c4^M
Content-Disposition: form-data; name="rutCompany"^M
^M
3^M
-----------------------------7d23e2a11301c4^M
Content-Disposition: form-data; name="dvCompany"^M
^M
5^M
-----------------------------7d23e2a11301c4^M
Content-Disposition: form-data; name="archivo"; filename="EnvioEjemplo.xml"^M
Content-Type: text/xml^M
^M
<?xml version="1.0" encoding="ISO-8859-1"?>^M
<EnvioDTE xmlns="http://www.sii.cl/SiiDte" ^M
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ^M
 xsi:schemaLocation="http://www.sii.cl/SiiDte EnvioDTE.xsd" ^M
 version="1.0">^M
<SetDTE ID="SetDoc">^M
…………………………………………………………………………….
</EnvioDTE>^M
^M
-----------------------------7d23e2a11301c4--^M
Para hacer esto tengo el siguiente código, a ver si estoy bien encaminado...

Código Delphi [-]
procedure Enviaarchivo;
var F : TStringList;//TextFile;
    SSLHandler: TIdSSLIOHandlerSocket;
begin  
  F:= TStringList.Create;
  F.LoadFromFile('c:\archivo.xml');
  IdSSLOpenSSLHeaders.Load;
  IdHTTP1.Request.CustomHeaders.clear;
  idHTTP1.Request.Clear;
  IdHTTP1.Request.CustomHeaders.Add('POST /cgi_dte/UPL/DTEUpload HTTP/1.0');
  IdHTTP1.Request.Accept:= 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, 
 application/vnd.ms-powerpoint, application/ms-excel, application/msword, */*';
  IdHTTP1.Request.Referer:= 'www.empresa.cl';
  IdHTTP1.Request.AcceptLanguage:= 'es-cl';
  IdHTTP1.Request.ContentType:= 'multipart/form-data: boundary='+'---------------------------7d23e2a11301c4';
  IdHTTP1.Request.AcceptEncoding:= 'gzip, deflate';
  IdHTTP1.Request.UserAgent:= 'Mozilla/4.0 (compatible; PROG 1.0; Windows NT 5.0; YComp 5.0.2.4)';
  IdHTTP1.Request.Host:= 'https://maullin.sii.cl';
  IdHTTP1.Request.ContentLength:= F.Count;//10000;
  IdHTTP1.Request.Connection:= 'Keep_Alive';
  IdHTTP1.Request.CacheControl:= 'no-cache';
  memo1.Lines.Add('-----------------------------7d23e2a11301c4' + #10#13);
  memo1.Lines.Add('Content-Disposition: form_data; name="rutSender"' + #10#13);
  memo1.Lines.Add(#10#13);
  memo1.Lines.Add(copy(FrmEnvioDTE.RutDTE,1,length(FrmEnvioDTE.RutDTE) - 2) + #10#13);
  memo1.Lines.Add('-----------------------------7d23e2a11301c4' + #10#13);
  memo1.Lines.Add('Content-Disposition: form_data; name="dvSender"' + #10#13);
  memo1.Lines.Add(#10#13);
  memo1.Lines.Add(copy(FrmEnvioDTE.RutDTE,length(FrmEnvioDTE.RutDTE), 1) + #10#13);
  memo1.Lines.Add('-----------------------------7d23e2a11301c4' + #10#13);
  memo1.Lines.Add('Content-Disposition: form_data; name="rutCompany"' + #10#13);
  memo1.Lines.Add(#10#13);
  memo1.Lines.Add(copy(FrmEnvioDTE.RutEmp,1,length(FrmEnvioDTE.RutEmp) - 2) + #10#13);
  memo1.Lines.Add('-----------------------------7d23e2a11301c4' + #10#13);
  memo1.Lines.Add('Content-Disposition: form_data; name="dvCompany"' + #10#13);
  memo1.Lines.Add(#10#13);
  memo1.Lines.Add(copy(FrmEnvioDTE.RutEmp,length(FrmEnvioDTE.RutEmp), 1) + #10#13);
  memo1.Lines.Add('-----------------------------7d23e2a11301c4' + #10#13);
  memo1.Lines.Add('Content-Disposition: form_data; name="archivo"; filename="DTEFXXX.xml"' + #10#13);
  memo1.Lines.Add('Content-Type: text/xml' + #10#13);
  memo1.Lines.Add(#10#13);
  {AssignFile(F, 'c:\archivo.xml');
  Reset(F);}

  memo1.Lines.Add(F.Text);
  memo1.Lines.Add(#10#13);
  memo1.Lines.Add(#10#13);
  memo1.Lines.Add('-----------------------------7d23e2a11301c4--' + #10#13);
  F.Free;
  memo1.Lines.SaveToFile('c:\archivo.xml');
  F:= TStringList.Create;
  F.LoadFromFile('c:\archivo.xml');
  IdHTTP1.Post('https://maullin.sii.cl',F);
  IdSSLOpenSSLHeaders.UnLoad;
end;

Cualquier ayuda, me servirá de mucho ya que llevo días en esto viendo foros y ejemplos.

Última edición por dec fecha: 28-10-2015 a las 14:31:35. Razón: Edición general y añadir la etiqueta CODE
Responder Con Cita
  #2  
Antiguo 27-10-2015
vicvil vicvil is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 157
Poder: 22
vicvil Va por buen camino
Bueno hice un pequeño cambio al final del código para obtener el error:

Código Delphi [-]
Stream := TStringStream.Create('');
  Params := TIdMultipartFormDataStream.Create;
  Params.AddFile('DTEUpload', 'c:\archivo.xml', '');
  try
    IdHTTP1.Post('https://maullin.sii.cl',Params, Stream);
  except
    on E: Exception do
    ShowMessage('Se encontró un problema al enviar el archivo:' + E.Message);
  end;
  ShowMessage(Stream.DataString);

al enviar el archivo me arroja el siguiente error:

"HTTP/1.1 400 Bad Request"

¿Será por el hecho que me falta el token? o ¿puede estar faltándome algo más?
Cualquier idea se agradecerá
Responder Con Cita
  #3  
Antiguo 28-10-2015
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Nunca he usado el IdHTTP de Indy, pero sí Synapse, y también he enviado todo tipo de documentos con PHP. A ver si te puedo echar una mano:

Efectivamente, las cabeceras deben enviarse antes que el documento, supongo que Indy ya se encarga de eso mediante la propiedad CustomHeaders. De todas formas, revisa que estás definiéndolas correctamente, ya que si no puede haber problemas a la hora de interpretarlas.

Por otro lado, el archivo que construyes en el "memo" no es XML. Es decir, todo lo que pones en ese código tiene pinta de ser la cabecera TCP/IP, HTTP, o del protocolo que sea, pero no es XML.

Respecto a las huellas o cookies, ¿no tiene IdHTTP métodos para gestionarlos? Lo digo porque es más cómodo que andar trapicheando con las cabeceras.

Respecto al error 400 que recibes, ¿quién te lo muestra, el servidor o el cliente? ¿Estás seguro de que las URLs están bien construidas y que los servicios funcionan correctamente?
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #4  
Antiguo 28-10-2015
vicvil vicvil is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 157
Poder: 22
vicvil Va por buen camino
hola Ñuño, gracias por responder,
La verdad es que yo estoy recién empezando a usar el componente IdHTTP y la verdad que no es mucha o derechamente casi nula la ayuda que existe en cuanto usarlo como cliente, mas bien toda la ayuda que he visto es respecto a usarlo como servidor, así es que estoy a tumbos aprendiendo.
Lo que hago para ingresar los datos en la cabecera, es ingresar directamente en las propiedades del componente, los datos que allí aparecen, es decir por ejemplo:

IdHTTP1.Request.AcceptLanguage:= 'es-cl';
IdHTTP1.Request.ContentType:= 'multipart/form-data: boundary='+'---------------------------7d23e2a11301c4';
IdHTTP1.Request.AcceptEncoding:= 'gzip, deflate';

no ingreso todo a traves de la propiedad cumtomheaders (no sé si habrá que ingresar toda la cabecera por ahí o como lo estaba haciendo yo basta).
En cuanto a cookie, la verdad no he visto que este componente tenga por donde ingresarlo.
Y en cuanto al error, los servicios están constantemente abiertos y no sé si es el servidor o el cliente quien me lo arroja.
Responder Con Cita
  #5  
Antiguo 28-10-2015
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hace mucho que no trasteo con las Indy pero viendo sus propiedades y métodos yo indagaría los siguientes:

Código Delphi [-]
function Post(AURL: string; const ASource: TIdMultiPartFormDataStream): string; overload;

Esta es la modalidad del método Post que te permite mandar datos con múltiples partes (el XML iría como una de esas partes)

La clase TIdMultiPartFormDataStream parece ser la que te permite adjuntar el XML con su método AddFile.

También, la propiedad CookieManager del IdHttp parece ser la que te permitirá enviar la cookie que requieres.

// Saludos
Responder Con Cita
  #6  
Antiguo 29-10-2015
vicvil vicvil is offline
Miembro
 
Registrado: may 2003
Ubicación: Chile
Posts: 157
Poder: 22
vicvil Va por buen camino
Muchas gracias Roman.
voy a probar y les cuento.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Dudas sobre Webservices Soap y Indy XaviQ OOP 6 30-03-2011 07:12:18
Error Unknown Protocol componente IdHTTP de Indy Bertifox2008 Internet 0 17-04-2009 01:10:24
WebBrowser con Indy idhttp sur-se Internet 2 10-10-2008 11:36:31
Problemas y dudas enviando comandos al servidor FTP con Indy Gromeer Internet 8 01-02-2008 23:27:04
Indy IdHTTP Ejemplo andre Internet 1 11-02-2004 09:06:31


La franja horaria es GMT +2. Ahora son las 18:39:03.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi