Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.119
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
HTTP GET y HTTP POST utilizando WinInet

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,nil,0,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;

Un ejemplo de como usar lo anterior.
Código Delphi [-]
var
  Campos: TStringlist;
  Stream: TMemoryStream;
begin
  Campos:= TStringList.Create;
  Stream:= TMemoryStream.Create;
  try
    Campos.Values['Nombre']:= 'Valor';
    Post('www.clubdelphi.com','/',80,Campos,Stream);
    Stream.SaveToFile('d:\1.txt');
    Stream.Clear;
    Get('http://www.clubdelphi.com/',Stream);
    Stream.SaveToFile('d:\2.txt');
  finally
    Campos.Free;
    Stream.Free;
  end;
end;
Responder Con Cita
  #2  
Antiguo 28-02-2007
vcarlosj vcarlosj is offline
Registrado
 
Registrado: feb 2007
Posts: 1
Poder: 0
vcarlosj Va por buen camino
Hola que tal..
He estado probando tu codigo y hay una parte en tu codigo que es:
hNet := InternetOpen('Agente', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

por que: "Agente".
Responder Con Cita
  #3  
Antiguo 24-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Pues "Agente" es el nombre que identifica al navegador a la hora de hacer la petición, puedes usar el que tu quieras, o utilizar el mismo que el internet explorer o el firefox para suplantarlos. Aunque creo que a la hora de hacer este tipo de programas es interesante identificarse correctamente, así el servidor sabe que el que esta accediendo es un "robot", "spider" o como lo quieras llamar y no un usuario normal. Esta información le puede resultar útil al hacer estadísticas o al programar sus paginas.
Responder Con Cita
  #4  
Antiguo 07-05-2007
davidvamo davidvamo is offline
Registrado
 
Registrado: feb 2006
Posts: 7
Poder: 0
davidvamo Va por buen camino
Buenas,
he probado tu ejemplo y todo correcto pero mi caso es que tengo que enviar por HTTPS hacia un WebService y por el puerto 4343 (para servidores de pruebas) o por el puerto 4433 (para servidores producción).

Tengo que enviar dos parámetros uno que es un código de referencia y el otro es código XML puro y duro.

¿Cómo hago que me use https y el puerto 4343 ó el 4433?.

Un ejemplo de la url que uso es la siguiente:

https://host:4343/WebServicesWeb/AqReceptorHTTP (srv pruebas)
ó
https://host:4433/WebServicesWeb/AqReceptorHTTP (srv. producción)

Muchas gracias y saludos.
Responder Con Cita
  #5  
Antiguo 07-05-2007
davidvamo davidvamo is offline
Registrado
 
Registrado: feb 2006
Posts: 7
Poder: 0
davidvamo Va por buen camino
Buenas,
he probado tu ejemplo y todo correcto pero mi caso es que tengo que enviar por HTTPS hacia un WebService y por el puerto 4343 (para servidores de pruebas) o por el puerto 4433 (para servidores producción).

Tengo que enviar dos parámetros uno que es un código de referencia y el otro es código XML puro y duro.

¿Cómo hago que me use https y el puerto 4343 ó el 4433?.

Un ejemplo de la url que uso es la siguiente:

https://host:4343/WebServicesWeb/AqReceptorHTTP (srv pruebas)
ó
https://host:4433/WebServicesWeb/AqReceptorHTTP (srv. producción)

Muchas gracias y saludos.
Responder Con Cita
  #6  
Antiguo 08-09-2008
Flecha Flecha is offline
Miembro
 
Registrado: nov 2006
Posts: 59
Poder: 18
Flecha Va por buen camino
Hola, ¿qué tal?
He probado el ejemplo y algo no funciona. Quizá sea por versión distinta de Delphi (yo tengo Delphi6), pero en la línea de código
Código:
URLEncode(PostStrings.ValueFromIndex[i]);
me dice que ValueFromIndex no está declarado. Así que lo he cambiado por
Código:
URLEncode(PostStrings.Strings[i]);
Por otro lado, yo intento acceder a una página realizada con ASP. En ella he puesto que me devuelva el típico "Hola mundo". Si accedo a ella con el explorador, veo el "Hola mundo" y me devuelve éste código fuente:
Código:
Hola mundo
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <title>WebForm1</title>
    <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
    <meta name=vs_defaultClientScript content="JavaScript">
    <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">
  </head>
  <body MS_POSITIONING="GridLayout">

    <form name="Form1" method="post" action="webform1.aspx?parametro1=1&amp;parametro2=julian" id="Form1">
<input type="hidden" name="__VIEWSTATE" value="dDwtNjU0MzcyMTk1Ozs+tEUMoOMBCErd5wWPW47ZHfAC2AI=" />


    </form>

  </body>
</html>
Pero si accedo utilizando tus procedimientos es esto lo que me devuelve:
Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <title>WebForm1</title>
    <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
    <meta name=vs_defaultClientScript content="JavaScript">
    <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">
  </head>
  <body MS_POSITIONING="GridLayout">

    <form name="Form1" method="post" action="webform1.aspx?parametro1=1&amp;parametro2=julian" id="Form1">
<input type="hidden" name="__VIEWSTATE" value="dDwtNjU0MzcyMTk1Ozs+tEUMoOMBCErd5wWPW47ZHfAC2AI=" />


    </form>

  </body>
</html>
Parece lo mismo, pero no lo es. Con tus procedimientos no me llega el "Hola mundo", así que no me vale.

¿Alguna idea para solucionarlo? Gracias.

Un saludo.
Responder Con Cita
  #7  
Antiguo 08-09-2008
Flecha Flecha is offline
Miembro
 
Registrado: nov 2006
Posts: 59
Poder: 18
Flecha Va por buen camino
Ya sé lo que pasa.

Por alguna razón que desconozco el Post() falla porque la web no recibe los parámetros pasados.

Sin embargo el Get() sí que funciona pasándole todo el chorro de parámetros seguido a la junto al URL.

Un saludo.
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


La franja horaria es GMT +2. Ahora son las 01:00:05.


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