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

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-08-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Question Ayuda con incompatibilidad del Post de TIdHTTP de Indy 8 con Indy 10

Hola,

Tengo una aplicación con Delphi 4 e Indy 8. Estoy migrando a Delphi 2007 (Update 1), el cual trae Indy 10.

El problema es que no funciona la llamada al método Post de TIdHTTP. Post es un método sobrecargado; pero solo estoy usando la llamada que en Indy 8 tenía la siguiente definición:

procedure Post(URL: string; const Source: TStrings; const AResponseContent:
TStream);

La razón por la cual falla es que en la versión 10 está transformando el fin de línea (CR + NL) en un caracter &. De acuerdo al sistema de Ayuda, esa conversión es el comportamiento normal bajo Indy 10; pero no indica porque cambiaron el comportamiento que traían de Indy 8 (no sé si lo hicieron en Indy 9) ni como hacer para que el componente en Indy 10 emule el comportamiento de la versión 8; de hecho ni siquiera advierten de ese cambio.

He intentado varias combinaciones con los parámetros de opciones de TIdHTTP; pero ninguna ha funcionado.

Cambiar el servidor para que reconozca el & como equivalente a CR + NL no es una solución viable.

La única solución que tengo hasta el momento es desmontar Indy 10 de Delphi 2007 e instalar Indy 8; pero quiero hacerlo solo como último recurso.

Alguno podría indicarme una solución diferente ?. Más aún, alguién sabe si aparte de este problema hay otras diferencias entre las dos versiones que afecten el comportamiento de TIdHTTP y en tal caso como hacer para emular totalmente el comportamiento viejo ?.
Responder Con Cita
  #2  
Antiguo 29-08-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Smile Solución

Hola,

De antemano gracias a cualquiera que haya pensado una solución y si es diferente a la que acabo de encontrar, agradecería si pudiera compartirla.

La solución que encontré fué usar un TStringStream en lugar de TStrings como parámetro de entrada. Es decir, usé la segunda forma del método sobrecargado Post, o sea :

procedure Post(URL: string; const Source, AResponseContent: TStream);

La conclusión es que, para mantener la compatibilidad, en Indy 8 debe usarse solo este método y no la otra versión del mismo.

He hecho varias pruebas y al parecer está trabajando bien. De todas formas, si alguién conoce algunos otros puntos de incompatibilidad de versiones, o algo de las razones para el cambio hecho en Indy, mucho agradecería si los comentara aquí.

Cita:
Empezado por rolandoj Ver Mensaje
Hola,

Tengo una aplicación con Delphi 4 e Indy 8. Estoy migrando a Delphi 2007 (Update 1), el cual trae Indy 10.

El problema es que no funciona la llamada al método Post de TIdHTTP. Post es un método sobrecargado; pero solo estoy usando la llamada que en Indy 8 tenía la siguiente definición:

procedure Post(URL: string; const Source: TStrings; const AResponseContent:
TStream);

La razón por la cual falla es que en la versión 10 está transformando el fin de línea (CR + NL) en un caracter &. De acuerdo al sistema de Ayuda, esa conversión es el comportamiento normal bajo Indy 10; pero no indica porque cambiaron el comportamiento que traían de Indy 8 (no sé si lo hicieron en Indy 9) ni como hacer para que el componente en Indy 10 emule el comportamiento de la versión 8; de hecho ni siquiera advierten de ese cambio.

He intentado varias combinaciones con los parámetros de opciones de TIdHTTP; pero ninguna ha funcionado.

Cambiar el servidor para que reconozca el & como equivalente a CR + NL no es una solución viable.

La única solución que tengo hasta el momento es desmontar Indy 10 de Delphi 2007 e instalar Indy 8; pero quiero hacerlo solo como último recurso.

Alguno podría indicarme una solución diferente ?. Más aún, alguién sabe si aparte de este problema hay otras diferencias entre las dos versiones que afecten el comportamiento de TIdHTTP y en tal caso como hacer para emular totalmente el comportamiento viejo ?.
Responder Con Cita
  #3  
Antiguo 24-09-2007
xio xio is offline
Miembro
 
Registrado: dic 2006
Posts: 87
Poder: 18
xio Va por buen camino
Red face

Buenas! Estoy intentando crear una aplicacion para poder enviar correos electronicos através de delphi 4 y la verdad es que estoy un poco perdida, me he bajado la version 8 de los componentes Indy y creo que los he instalado, aunque no se si de forma correcta o no. Me gustaria que me echarais una mano y me indicarais como puedo empezar con el tema.

Un saludo!
Responder Con Cita
  #4  
Antiguo 24-09-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Voy a averiguar y te comento

Cita:
Empezado por xio Ver Mensaje
Buenas! Estoy intentando crear una aplicacion para poder enviar correos electronicos através de delphi 4 y la verdad es que estoy un poco perdida, me he bajado la version 8 de los componentes Indy y creo que los he instalado, aunque no se si de forma correcta o no. Me gustaria que me echarais una mano y me indicarais como puedo empezar con el tema.

Un saludo!
Hola,

Te cuento que no he tenido la oportunidad de usar Indy 8 con Delphi 4 para enviar correos; de hecho nunca he usado Indy para el envío de correos. El envío de correo lo he hecho sin inconvenientes con Delphi 5 y FastNet para correos internos (recuerdo haber leído algo de que FastNet tiene problemas para los externos). Lo curioso del caso es que hacerlo fué muy fácil; pero, posteriormente, cuando tuve problemas con FastNet para la conexión Web, fué cuando me enteré que FastNet tenía serios problemas en esa área y en consecuencia empecé a trabajar con Indy. Para estar homogeneo intenté pasar la parte de correo a Indy; pero lo encontré muy complicado con respecto a FastNet y me dió tantos problemas que opté por seguír usando FastNet para correo.

En este momento estoy lidiando con un problema bastante complicado de registro de componentes en Delphi 2007; pero en cuanto me desocupe te prometo que miro a ver como es el envío desde Delphi 4 con Indy 8. Espero que a más tardar mañana en la noche te pueda decir algo al respecto

Si mientras tanto alguién puede explicar algo sobre el tema, bienvenido sea.

Saludos
Responder Con Cita
  #5  
Antiguo 24-09-2007
xio xio is offline
Miembro
 
Registrado: dic 2006
Posts: 87
Poder: 18
xio Va por buen camino
Muchas gracia

Gracias por la rapidez, estoy avanzando algo pero me da errores que no tengo ni idea de como resolver, a ver si puedo encontrar algo de ayuda por ahi. Un saludo y suerte con tus problemillas!
Responder Con Cita
  #6  
Antiguo 25-09-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Smile Lo que te he averiguado

Cita:
Empezado por xio Ver Mensaje
Gracias por la rapidez, estoy avanzando algo pero me da errores que no tengo ni idea de como resolver, a ver si puedo encontrar algo de ayuda por ahi. Un saludo y suerte con tus problemillas!
Hola,

Como te prometí, aquí esta lo que he podido averiguarte hasta ahora:
Los mensajes se envían mediante objetos del tipo TIdSMTP. Este es un componente Indy disponible en la paleta Indy Clients. Cada mensaje se almacena en objetos del tipo TIdMessage. Este es un componente Indy disponible en la paleta Indy Misc.

Para definir el mensaje, las propiedades claves de TIdMessage son las siguientes:

Body : Esta propiedad es un TStringList que almacena el texto del mensaje
From : Esta propiedad es del tipo TIdEmailAddressItem, un tipo usado por Indy para definir direcciones. La prpoiedad indica el correo del que envía
Subject : Es un string con el título o asunto del mensaje
Recipients : Esta propiedad indica la lista de direcciones a donde se enviará el mensaje. Es del tipo TIdEmailAddressList, el cual es usado por Indy para manejar los TIdEmailAddressItem,

Lógicamente hay más; pero estas son las básicas.

El manejo de direcciones dado por TIdEmailAddressItem se maneja con 3 propiedades:

Address : La dirección de correo en sí
Name : El nombre asociado a esa dirección
Text : El texto usado para desplegar direcciones, o se 'Name <Address>'

Finalmente, el componente TIdSMTP se configura con base a 3 propiedades:

Port : El número del puerto (por default 25)
Host : La dirección IP o el nombre del servidor
AutheticationType : Usa atNone si no requiere autenticar, o si es requerido, usa atLogin, suministrando además las credenciales en las propiedades UserId y Password

Una vez definido lo anterior, hacer el envío requiere 3 métodos de TIdSMTP

a. Llamar al método Connect para establecer la conexión
b. Enviar el mensaje con el método Send
c. Garantizar el fin de la conexión con el método Disconnect

La siguiente rutina ilustra toda esta teoría:

Código Delphi [-]
procedure TForm1.BtnEnviarClick(Sender: TObject);
Var
   ElDestinatario:      TIdEmailAddressItem;
begin
     { Crea el Mensaje en IdEnviar, que es del tipo TIdMessage }
     IdEnviar.Body.Text     := 'Este es el texto a enviar';
     IdEnviar.From.Address  := 'elqueenvia@midominio.com'; { e-mail del que envía }
     IdEnviar.From.Name     := 'Pedro Perez'; { El nombre del que envía }
     IdEnviar.Subject       := 'Este es el título del mensaje';
     ElDestinatario         := IdEnviar.Recipients.Add;
     ElDestinatario.Address := 'destino1@dominio1.com'; { Primer destinatario }
     ElDestinatario.Name    := 'Nombre del primer destinario';
     ElDestinatario         := IdEnviar.Recipients.Add;
     ElDestinatario.Address := 'destino2@dominio2.com'; { Segundo destinatario }
     ElDestinatario.Name    := 'Nombre del segundo destinario';
     { Realiza el envío }
     ElIdSMTP.Port          := 25; { El Puerto }
     ElIdSMTP.AuthenticationType := atNone;
     { Si requiere Login debe ser atLogin en lugar de atNone y debe indicarse
       Usuario y Password así :
     ElIdSMTP.UserId             := 'Usuario1';
     ElIdSMTP.Password           := 'password1'; }
     ElIdSMTP.Host               := '200.89.96.4';  { La IP o El nombre del Host }
     Try
        ElIdSMTP.Connect;
        Try
           ElIdSMTP.Send(IdEnviar);
           ShowMessage('Enviado');
        Finally
           ElIdSMTP.Disconnect;
        End;
     Except
        On E:Exception Do Begin
           ShowMessage(E.Message);
        End;
     End;
end;
Coloco el puerto solo para ilustración, ya que el default es 25.

Observa el uso de la variable ElDestinatario para agregar uno a uno, un par de destinarios a la lista dada por Recipients. Es de anotar que TIdEmailAddressItem está definido en la unidad IdEMailAddress, por tanto, debes agregarla a clausula Uses.

El principal problema es determinar los parámetros correctos para las propiedades de TIdSMTP. Creo que ahí es donde estarán tús problemas.

Bueno, espero que esto te ayude

Saludos
Responder Con Cita
  #7  
Antiguo 26-09-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Como te fué ?

Hola,

Te funcionó ?. Aunque ahora a mi me ha trabajado muy bien con Delphi 4, aquella ocasión en que lo hice por primera vez tuve muchos problemas; así que me gustaría saber de tús experiencias.
Responder Con Cita
  #8  
Antiguo 27-09-2007
xio xio is offline
Miembro
 
Registrado: dic 2006
Posts: 87
Poder: 18
xio Va por buen camino
Thumbs up

Si que me funciono, tuve unos problemas a la hora de autentificarme por que el servidor lo requiere, pero lo solucione. Muchisimas gracias por todo. Un saludo enorme!
Responder Con Cita
  #9  
Antiguo 27-09-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Smile Me alegro

Cita:
Empezado por xio Ver Mensaje
Si que me funciono, tuve unos problemas a la hora de autentificarme por que el servidor lo requiere, pero lo solucione. Muchisimas gracias por todo. Un saludo enorme!
Hola,

De nada. Me alegro de haber podido ayudarte. A la orden para cualquier otra cosa.

Muchos Saludos
Responder Con Cita
  #10  
Antiguo 02-10-2007
xio xio is offline
Miembro
 
Registrado: dic 2006
Posts: 87
Poder: 18
xio Va por buen camino
Segun he leido creo que tiene algo que ver

Hola de nuevo, otra vez estoy por aqui, no se si estoy en lo cierto pero he leido algo por ahi y creo que tiene algo que ver.

Comienzo, estoy intentado añadir en una aplicacion echa en Delphi 4 la opcion de enviar SMS a moviles a través de internet, y he leido por ahi que con Indy se puede. Mientras me comentais algo sigo buscando como loca por internet a ver si doy con algo.

Un saludo!!

PD: El envio de mail va D.P.M!!! Gracias!!!
Responder Con Cita
  #11  
Antiguo 02-10-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Voy a averiguar. Sugiero otro hilo

Cita:
Empezado por xio Ver Mensaje
Hola de nuevo, otra vez estoy por aqui, no se si estoy en lo cierto pero he leido algo por ahi y creo que tiene algo que ver.

Comienzo, estoy intentado añadir en una aplicacion echa en Delphi 4 la opcion de enviar SMS a moviles a través de internet, y he leido por ahi que con Indy se puede. Mientras me comentais algo sigo buscando como loca por internet a ver si doy con algo.

Un saludo!!

PD: El envio de mail va D.P.M!!! Gracias!!!
Hola xio,

La verdad nunca he hecho algo así con Delphi 4. Me dá curiosidad y yo también voy a averiguar. Esta noche lo haré y entonces compartiremos experiencia.

Por otra parte, de acuerdo a la guía de estilo, este tema debería ir en un hilo diferente. Te sugiero abrirle uno, o si ya lo has hecho, envíame aquí un enlace al mismo.
Responder Con Cita
  #12  
Antiguo 02-10-2007
xio xio is offline
Miembro
 
Registrado: dic 2006
Posts: 87
Poder: 18
xio Va por buen camino
Ok, dentro de la seccion Foros en la parte de Internet ya hay un hilo abierto con Enviar SMS, y postee por ahi. Colgue el ultimo post por aqui por que como expliqué lei en un sitio de internet que habia que utilizar algun componente Indy, espero que nadie lo tome a mal.

Un saludo! Ya hablamos por el otro hilo OK!
Responder Con Cita
  #13  
Antiguo 23-12-2008
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Poder: 20
Bauhaus1975 Va por buen camino
Hola, vuelvo a recuperar este hilo.
Resulta que yo también he tenido estos problemas de incompatibilidad. Estaba usando Delphi 6, y ahora trabajo sobre BStudio 2005 para Win32.

Tengo un procedimiento para capturar páginas por HTTP, mediante GET o POST, y he usado los consejos que se detallan al principio de este post para adaptarlo a mi nuevo IDE.

Resulta que no sé cómo hacer que los métodos GET o POST puedan aceptar una URL que venga en una variable. Tal y como en el ejemplo de código que adjunto estoy haciendo...
Gracias y un saludo.

Código Delphi [-]
function captureHTTP(URL, strParams:String; objCont:TComponent; method:String):String;
Var
  aStream: TMemoryStream;
  Params: TStringStream ;
  HTTP: TidHTTP;
begin
  HTTP := TIdHTTP.Create(objCont);
  HTTP.HandleRedirects := true;
  Params := TStringStream.create('');
  aStream := TMemoryStream.create;
  if (method = 'post') then
 HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
  try
    with HTTP do begin
      try
        if (method = 'post') then
            HTTP.Post(URL, Params, aStream)
        else
            HTTP.Get(URL+strParams,aStream);
        end;
      except
        on E: Exception do
          showmessage('Error al intentar hacer HTTP REQUEST: ' + E.Message);
      end;
    end;
    aStream.WriteBuffer(#0' ', 1);
  except
  end;
  result := PChar(aStream.Memory);
end;
Responder Con Cita
  #14  
Antiguo 24-12-2008
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Poder: 20
Bauhaus1975 Va por buen camino
Parece que lo he solucionado, usando una variable intermedia.
Gracias de todas maneras.
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
ayuda Indy hidal C++ Builder 1 27-08-2006 21:28:55
Ayuda con Indy JerS Varios 1 07-10-2005 22:44:10
Ayuda con componentes Indy FTP taita Internet 3 26-10-2004 11:09:45
Ayuda con las Indy por favor :'( k4sp3r Internet 9 25-09-2004 21:37:55
Ayuda Indy VolaRe Internet 1 14-09-2004 00:51:28


La franja horaria es GMT +2. Ahora son las 01:28:13.


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