Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Bueno, como alternativa a Indy podemos usar Wininet. Podemos hacer Get, podemos hacer Post y maneja las cookies perfectamente incluso las de sesión. No tengo nada en contra de las Indy, es solo por dar alternativas, además no se pueden usar en el Turbo , aunque eso no es culpa suya.

Bueno, un poco de código para animar la cosa:
Código Delphi [-]
uses Windows, SysUtils, Classes,Wininet;

// URL Encode y Decode para codificar los strings segun la norma RFC 1738
function URLEncode(Str: string): string;
var
  i: integer;
begin
  Result:= '';
  for i:= 1 to Length(Str) do
    if Str[i] in ['A'..'Z','a'..'z','0'..'9','-','_','.'] then
      Result:= Result + Str[ i ]
    else
      Result:= Result + '%' + IntToHex(Ord(Str[ i ]),2);
end;

function URLDecode(Str: string): string;
var
  i: integer;
begin
  Result:= '';
  Str:= StringReplace(Str, '+', ' ', [rfReplaceAll]);
  while Length(Str) > 0 do
  begin
    if Copy(Str, 1, 1) = '%' then
    begin
      if not TryStrToInt('$' + Copy(Str, 2, 2),i) then
      begin
        Result:= '';
        Exit;
      end;
      Result:= Result + Char(i);
      Delete(Str, 1, 2);
    end else Result:= Result + Copy(Str, 1, 1);
    Delete(Str,1,1);
  end;
end;

// Con esta funcion hacemos Get y nos devuleve el resultado en un stream
function Get(Url: string; Stream: TStream): Boolean;
var
  hNet: HINTERNET;
  hUrl: HINTERNET;
  Buffer: array[0..10240] of Char;
  BytesRead: Cardinal;
begin
  Result:= FALSE;
  hNet:= InternetOpen('Agente', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hUrl:= InternetOpenUrl(hNet, PChar(Url), nil, 0,
      INTERNET_FLAG_RELOAD, 0);
    if (hUrl <> nil) then
    begin
      while (InternetReadFile(hUrl, @Buffer, sizeof(Buffer), BytesRead)) do
      begin
        if (BytesRead = 0) then
        begin
          Result:= TRUE;
          break;
        end;
        Stream.Write(Buffer,BytesRead);
      end;
      InternetCloseHandle(hUrl);
    end;
    InternetCloseHandle(hNet);
  end;
end;

// Con esta funcion hacemos Post, los campos del formulario se pasan en PostString
// como pares nombre=valor
function Post(Servidor, Pagina: string; Puerto: Word;
  PostStrings: TStringList; Stream: TStream): Boolean;
var
  hNet: HINTERNET;
  hCon: HINTERNET;
  hReq: HINTERNET;
  Context: DWORD;
  Str: string;
  i: integer;
  Buffer: array[0..10240] of Char;
  BytesRead: DWORD;
begin
  Context:= 0;
  Result := FALSE;
  Str:= '';
  hNet := InternetOpen('Agente', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hCon:= InternetConnect(hNet,PChar(Servidor),Puerto,nil,nil,
      INTERNET_SERVICE_HTTP,0,Context);
    if (hCon <> nil) then
    begin
      hReq:= HttpOpenRequest(hCon,'POST',PChar(Pagina),nil,nil,nil,
        INTERNET_FLAG_RELOAD,Context);
      if (hReq <> nil) then
      begin
        for i:= 0 to PostStrings.Count - 1 do
        begin
          Str:= Str + '&' + URLEncode(PostStrings.Names[i]) + '=' +
            URLEncode(PostStrings.ValueFromIndex[i]);
        end;
        Delete(Str,1,1);
        try
          if HttpSendRequest(hReq,
            'Content-Type: application/x-www-form-urlencoded',Cardinal(-1),
            PChar(Str),Length(Str)) then
          begin
            while (InternetReadFile(hReq,@Buffer,sizeof(Buffer),BytesRead)) do
            begin
              if (BytesRead = 0) then
              begin
                Result := TRUE;
                break;
              end;
              Stream.Write(Buffer,BytesRead);
            end;
          end;
          except end;
        InternetCloseHandle(hReq);
      end;
      InternetCloseHandle(hCon);
    end;
    InternetCloseHandle(hNet);
  end;
end;

Ahora que ya podemos hacer Get y Post solo nos falta analizar las paginas que obtenemos ¿voy por buen camino?

EDITO:
Modifico la función Post para incluir la cabecera Content-Type, que al parecer es necesaria, al menos para el siguiente ejemplo:

Entrar al ClubDelphi, iniciar sesión y obtener la pagina principal de los foros:
Código Delphi [-]
procedure Ejemplo;
var
  Campos: TStringlist;
  Stream: TMemoryStream;
begin
  Campos:= TStringList.Create;
  Stream:= TMemoryStream.Create;
  try
    Campos.Values['vb_login_username']:= 'usuario';
    Campos.Values['vb_login_password']:= 'password';
    Campos.Values['submit']:= 'Ingresar';
    Campos.Values['s']:= '';
    Campos.Values['do']:= 'login';   
    Post('www.clubdelphi.com','/foros/login.php',80,Campos,Stream);
    Stream.Clear;
    Get('http://www.clubdelphi.com/foros/',Stream);
    Stream.SaveToFile('d:\1.txt');
  finally
    Campos.Free;
    Stream.Free;
  end;
end;

Última edición por seoane fecha: 02-11-2006 a las 20:32:34.
Responder Con Cita
  #2  
Antiguo 01-11-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola a todos!

Gracias Seoane, David y Antonio por la información que me proporcionan. Este viernes evaluaré sus sugerencias y haré las primeras pruebas. Los mantendré informados de mis avances para que el curso de esta solución (el hilo en sí) sea una experiencia de la que puedan aprender otros desarrolladores que se encuentren en la misma vicisitud.

Un abrazo telarañudo.

Al González.
Responder Con Cita
  #3  
Antiguo 01-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Domingo
¿voy por buen camino?
Pues yo creo que sí, vamos. Está muy bien Seoane.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 01-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Román, personalmente también pienso que utilizar las Indy puede ser más razonable, empero, estarás conmigo en que el código fuente es una maravilla, que acaso en ocasiones sea mejor (en varios aspectos y por diversos motivos) utilizar, directamente, el API WinInet. Yo desde luego me he permitido añadir el código entre el resto de Trucos, con el permiso de Seoane, pues que creo que puede ser un código fuente muy útil.

Ahora, ¿que por eso digo que las Indy no debieran usarse? Nada de eso, de hecho ya he dicho que me parece más razonable usarlas, siempre que sea posible; pero también digo que no viene de más tener otras opciones, que ratón que conoce un agujero sólo pronto le caza el gato (o algo así).

¿Que no?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 01-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Estoy de acuerdo contigo Román. Más ahora que sé que puede funcionar mejor incluso. Empero, lo dicho dicho, una cosa no quita la otra. En realidad creo que estamos de acuerdo todos, incluído el propio Domingo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 01-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Vaya me levanto para cenar algo y como se animo la conversación. Vamos ir por partes como dijo Jack.
Cita:
Empezado por Roman
¿Que no puedes usar las Indy en TurboExplorer? ¿Y quién dice que no?
Yo no dije nunca lo contrario, de hecho al poquito tiempo de salir los turbo comente por aqui que se podían usar las Indy por código.
Cita:
Empezado por Roman
No puedes incrustarlas en un formulario y asignar sus propiedades con el Inspector de objetos, pero sí puedes instanciarlas manualmente, y que yo sepa eso es legal. Siendo componentes no visuales, no es mucha la carga de hacerlo a pie
No, no resulta mucho trabajo hacerlo a mano, pero tampoco mucho menos que hacerlo con Wininet.
Cita:
Empezado por Roman
Por otra parte, wininet es una api de "alto nivel" para facilitar el uso de los protocolos tcp, pero esto mismo hace que no sea tan eficiente como las componentes indy que usan dichos protocolos a "bajo nivel"
Hombre, cual de los 2 es mas eficiente seria discutible. Si bien es verdad que el código de las Indy es impecable, también es verdad que se a convertido en un gigante, con múltiples propiedades, eventos, etc ... solo hay que ver el par de cientos de Kb que añade al ejecutable para ver su envergadura. Además no hay razón para suponer que el código de microsoft desde que se hace una petición http hasta el Winsock, de muchas mas vueltas que Indy desde que hacemos una petición http hasta el winsock (Indy también hace uso del winsock, es todo lo abajo que llega ). Tendríamos que hacer pruebas, pero apuesto a que wininet podría obtener tiempos iguales o mejores que Indy.

Y por ultimo algo mas subjetivo, me gusta mas el Wininet que le vamos a hacer. Pero si bien es verdad me he fijado que en este foro suele gustar mucho mas las Indy, así que supongo que serán mejores, pero yo todavía no he visto que ofrezca grandes ventajas, al menos en aplicaciones cliente, no así si queremos hacer, por ejemplo, un servidor. Pero eso ya es otra historia ...
Responder Con Cita
  #7  
Antiguo 01-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Las ventajas que ofrecen las Indy deben ser, sin duda, la orientación a objetos, esto es, que son un conjunto de componentes y clases que te permiten trabajar manipulando propiedades, invocando métodos, respondiendo a eventos, etc.

Ahora bien, mirando el código que has presentado Seoane dan ganas en encapsularlo y presentarlo en una clase. En todo caso creo que puede resultar muy útil.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 02-11-2006
tefots tefots is offline
Miembro
 
Registrado: feb 2005
Posts: 108
Poder: 22
tefots Va por buen camino
volviendo al tema

aqui pongo un ejemplo de como hacer un post usando las indy.
creo que es mas sencillo que usando las wininet.

el get seria parecido.


Código Delphi [-]
procedure TForm1.SendPostData;
Var
  aStream: TMemoryStream;
  Params: TStringStream;
begin
  aStream := TMemoryStream.create;
  Params := TStringStream.create('');

  try
    with IdHTTP1 do
    begin
      Params.WriteString(URLEncode('teste=' + 'yes' + '&'));
      Params.WriteString(URLEncode('name=' + 'ivan' + '&'));
      Params.WriteString(URLEncode('number=' + '102'));
      Request.ContentType := 'application/x-www-form-urlencoded';
      try
        Post('http://localhost/teste.asp', Params, aStream);
      except
        on E: Exception do
          showmessage('Error encountered during POST: ' + E.Message);
      end;
    end;
  aStream.WriteBuffer(#0' ', 1);
  aStream.Position := 0;
  Memo1.Lines.LoadFromStream(aStream);
  except
  end;
end;
Responder Con Cita
  #9  
Antiguo 02-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Por favor Roman llámame Domingo que hay confianza . Por otro lado, Dec en su truco 346 utiliza un TIdMultiPartFormDataStream, en concreto el método AddFormField para pasar los parámetros, ignoro cual es la mejor forma de hacerlo. A mi también se me hace mas cómodo usar un TStringList, en eso parece que estamos de acuerdo.

Por si tienes curiosidad wininet creo también maneja el código código 302, al menos maneja el 301 . En cuanto a las cookies, ya dije antes que si las maneja, incluso utiliza las cookies guardadas previamente, con el típico "Recordar contraseña" que se encuentra en algunas paginas web.

Pero dejemos este tema a un lado, lo importante es que tanto por un método como por el otro obtenemos un resultado en un Stream. Centremonos entonces en ese punto, yo también estoy esperando haber que solución se puede utilizar para examinar el contenido de la respuesta.
Responder Con Cita
  #10  
Antiguo 04-11-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola de nuevo!

Muchas de estas cosas son nuevas para mí. Mi conocimiento actual sobre HTTP se reduce a unas pequeñas prácticas realizadas con PHP en el verano de 2005.

Con un día de retraso en mi agenda, empezaré a probar el componente TIdHttp, muy bien sugerido e ilustrado por David.

Domingo: los enlaces y ejemplos que me indicas me resultaron muy interesantes también. Ya había buscado en los foros, aunque no lo suficiente por lo que veo.

Antonio: habré de molestarte con algunos consejillos cuando me tope con eso de las galletas de sesión (¡mmm, galletas! , de pronto abrírseme el apetito, me acercaré unas con chispas de chocolate que tengo en la cocina...).

Bien, manos a la obra...

Un abrazo HTTP.

Al González.
Responder Con Cita
  #11  
Antiguo 04-05-2013
pedrolazarus pedrolazarus is offline
Miembro
NULL
 
Registrado: sep 2012
Posts: 91
Poder: 14
pedrolazarus Va por buen camino
Smile

Cita:
Empezado por seoane Ver Mensaje
Bueno, como alternativa a Indy podemos usar Wininet. Podemos hacer Get, podemos hacer Post y maneja las cookies perfectamente incluso las de sesión. No tengo nada en contra de las Indy, es solo por dar alternativas, además no se pueden usar en el Turbo , aunque eso no es culpa suya.

Bueno, un poco de código para animar la cosa:

Y se formo la fiesta

Exelente aporte para lo que no tienen instalado el componente indy sobre todo en lazarus
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Automatizacion de word (generar documentos) alt126 C++ Builder 4 24-04-2007 04:19:27
Automatizacion de word (insertar tablas) alt126 C++ Builder 2 04-11-2005 10:44:29
Consejo Automatizacion Excel Builder C++ alt126 C++ Builder 0 14-04-2005 10:52:04
HTTP Indy bochi Internet 1 27-12-2003 01:57:34
Http Server ebeltete Internet 0 17-05-2003 02:57:39


La franja horaria es GMT +2. Ahora son las 15:19:08.


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