es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtener datos HTTP continuos?

Estoy intentando obtener datos de trading en vivo desde Internet a través de HTTP, pero se actualiza continuamente, así que si hago una petición GET, seguirá descargando mientras haya datos disponibles. Hasta que detenga la transmisión de descarga, entonces podré acceder a los datos.

¿Cómo acceder al flujo de datos mientras la descarga está en progreso?

Intenté usar TIdHTTP de Indy, para poder usar SSL, pero intenté con IdIOHandlerStream, pero ya se estaba usando para IdSSLIOHandlerSocketOpenSSL. Así que estoy completamente confundido aquí.

Esto es en respuesta a una solicitud "multipart/form-data".

Por favor guíame…

Lrequest.Values['__RequestVerificationToken'] := RequestVerificationToken;
Lrequest.Values['acct'] := 'demo';
Lrequest.Values['pwd'] := 'demo';

try    
  Response.Text := Onhttp.Post('https://trading/data', Lrequest);
  Form1.Memo1.Lines.Add(TimeToStr(Time) + ': ' + Response.Text);
except
  on E: Exception do
    Form1.Memo1.Lines.Add(TimeToStr(Time) + ': ' + E.ClassName +
      ' ha generado un error, con el mensaje: ' + E.Message);
end;

ACTUALIZACIÓN:

Los datos son una cadena JSON infinita, así:

json
{"id":"datos","val":[{"rc":2,"tpc":"\RealTime\Global\SGDIDR.FX","item":[{"val":{"F009":"10454.90","F011":"-33.1"}}]}]}
{"id":"datos","val":[{"rc":2,"tpc":"\RealTime\Global\SGDIDR.FX","item":[{"val":{"F009":"10458.80","F011":"-29.2"}}]}]}

y así sucesivamente…

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para acceder al flujo de datos mientras la descarga está en progreso, se puede utilizar el evento OnWork del componente TIdHTTP de Indy. Este evento se activa periódicamente durante el proceso de transferencia de datos y permite hacer un seguimiento del progreso de la descarga y acceder a los datos descargados conforme se van recibiendo.

    Aquí hay un ejemplo de cómo se puede utilizar el evento OnWork para analizar los datos JSON entrantes en tiempo real:

    var
      HTTP: TIdHTTP;
      Request: TIdMultiPartFormDataStream;
      Response: TStringStream;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      HTTP := TIdHTTP.Create;
      HTTP.Request.ContentType := 'multipart/form-data';
      HTTP.AllowCookies := True;
      HTTP.HandleRedirects := True;
      HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0';
      HTTP.OnWork := HTTPWork;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Request := TIdMultiPartFormDataStream.Create;
      Request.AddFormField('__RequestVerificationToken', RequestVerificationToken);
      Request.AddFormField('acct', 'demo');
      Request.AddFormField('pwd', 'demo');
      Response := TStringStream.Create('');
      try
        HTTP.Post('https://trading/data', Request, Response);
      except
        on E: Exception do
          ShowMessage('Error: ' + E.Message);
      end;
    end;
    
    procedure TForm1.HTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
    var
      JSONData: TJSONValue;
      JSONObject: TJSONObject;
      JSONString: string;
    begin
      if AWorkMode = wmRead then
      begin
        JSONString := Response.DataString.Substring(replylength);
        while JSONString <> '' do
        begin
          JSONData := TJSONObject.ParseJSONValue(JSONString, False);
          if JSONData <> nil then
          begin
            JSONObject := JSONData as TJSONObject;
            try
              ProcessJSONData(JSONObject);
            finally
              FreeAndNil(JSONObject);
            end;
          end;
        end;
      end;
    end;
    
    procedure TForm1.ProcessJSONData(JSONObject: TJSONObject);
    var
      ID: string;
      Val: TJSONArray;
      Item: TJSONArray;
      ValObject: TJSONObject;
      F009, F011: string;
    begin
      ID := JSONObject.GetValue('id').Value;
      if ID = 'data' then
      begin
        Val := JSONObject.GetValue('val') as TJSONArray;
        for Item in Val do
        begin
          ValObject := Item.GetValue(0) as TJSONObject;
          F009 := ValObject.GetValue('val').GetValue('F009').Value;
          F011 := ValObject.GetValue('val').GetValue('F011').Value;
          // Process F009 and F011 data as needed
        end;
      end;
    end;
    

    En este ejemplo, creamos una instancia de TIdHTTP y establecemos su evento OnWork en HTTPWork. En el método Button1Click, creamos un TIdMultiPartFormDataStream para enviar los parámetros de solicitud necesarios y un TStringStream para recibir los datos de respuesta.

    En el evento HTTPWork, comprobamos que el parámetro AWorkMode está configurado en wmRead, lo que significa que estamos leyendo los datos del servidor. A continuación, analizamos los datos JSON entrantes en tiempo real llamando repetidamente a TJSONObject.ParseJSONValue con los datos de cadena restantes hasta que los hayamos procesado todos.

    Por último, procesamos los datos JSON analizados en el método ProcessJSONData según sea necesario. En este ejemplo, solo nos interesa los datos JSON con un campo id de "data", que contiene una matriz de valores de datos que extraemos y procesamos.

Comments are closed.