AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft
Thema durchsuchen
Ansicht
Themen-Optionen

Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft

Ein Thema von bogdan · begonnen am 27. Apr 2018 · letzter Beitrag vom 28. Apr 2018
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft

  Alt 27. Apr 2018, 12:15
Stell doch mal dein komplettes Projekt (Source) ohne kompilierung gepackt als .zip/.rar Anhang rein, kann ja nicht groß sein, vielleicht liegt der Fehler an ganz anderer Stelle.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#2

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft

  Alt 27. Apr 2018, 12:43
Code:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdHTTP, Vcl.StdCtrls, Vcl.ExtCtrls,
  IdZLibCompressorBase, IdCompressorZLib, IdCookieManager, IdBaseComponent,
  IdComponent, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
  IdSSLOpenSSL, IdSSLOpenSSLHeaders, IdCTypes;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Memo1: TMemo;
    Edit1: TEdit;
    Button1: TButton;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    IdCookieManager1: TIdCookieManager;
    IdCompressorZLib1: TIdCompressorZLib;
    procedure Button1Click(Sender: TObject);
    procedure IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(ASender: TObject;
      const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType,
      AMsg: string);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure SetNewIdHTTP;
  end;

var
  Form1: TForm1;
  gIdHTTP : TIdHTTP;

implementation

{$R *.dfm}

procedure TForm1.IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(ASender: TObject;
  const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType,
  AMsg: string);
begin
  SSL_set_tlsext_host_name(AsslSocket, gIdHTTP.Request.Host);
end;


procedure TForm1.SetNewIdHTTP;
begin
  if Assigned(gIdHTTP) then
  begin
    Memo1.Clear;
    gIdHTTP.Free;
  end;
  gIdHTTP := TIdHTTP.Create(nil);
  gIdHTTP.AllowCookies := True;
  gIdHTTP.HandleRedirects := True;
  gIdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
  gIdHTTP.CookieManager := IdCookieManager1;
  gIdHTTP.Compressor := IdCompressorZLib1;
end;

function StreamToText(sStream: TStream; sOldSign, sNewSign: Integer): AnsiString;
var
  xBuf: TBytes;
  i : Integer;
begin
  try
    SetLength(xBuf, sStream.Size); // puffer größe bestimmen
    sStream.ReadBuffer(Pointer(xBuf)^, Length(xBuf)); // puffer füllen
    for I := 0 to Length(xBuf) -1 do
      if xBuf[i] = sOldSign then xBuf[i] := sNewSign; // mache aus 0 ein Leerzeichen
  finally
    SetLength(Result, Length(xBuf)); // ausgabegröße
    for I := 0 to Length(xBuf) -1 do
      Result[i+1] := AnsiChar(xBuf[i]); // alles aus puffer ins Result
  end;
end;

function IdHTTP_Get(sHTTP: TIdHTTP; sURL: String): String;
var
  xResult : TStringList;
  xMemoRes : TMemoryStream;
begin
  xResult := TStringList.Create;
  xMemoRes := TMemoryStream.Create;
  try
    try
      sHTTP.Get(sURL, xMemoRes);
      xMemoRes.Position := 0;
      xResult.Text := StreamToText(xMemoRes, 0, 20);
    except
      on E: EIdHTTPProtocolException do
      begin
        xResult.Add('E.Message: ' + E.Message);
        xResult.Add('E.ErrorMessage:');
        xResult.Add(E.ErrorMessage);
      end;
    end;
  finally
    Result := xResult.Text;
    xResult.Free;
    xMemoRes.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetNewIdHTTP;
  Memo1.Text := IdHTTP_Get(gIdHTTP, Edit1.Text);
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft

  Alt 27. Apr 2018, 18:12
Hallo bogdan,
gut wäre ein Projekt-Upload gewesen für alle Properties (die stehen in der .dfm Datei) die Du so gesetzt hast.
Auch gut zu Wissen was in Edit1.Text steht, nur eine blanko Webadresse ohne Endung?
Soll das Ziel sein den HTML Source-Code zu laden oder eine bestimmte Datei?


edit
Hier ein Beispiel um HTTP HTML Sourcecode zu laden:
Delphi-Quellcode:
function DownloadHTMLSource( var xUrl : ansiString ):ansiString;
const
  INET_USERAGENT = 'Mozilla/4.0, Indy Library (Windows; en-US)'; // Damit sagst Du "Hallo, ich bin..."
  INET_TIMEOUT_SECS = 3; // Wieviele Sekunden warten bevor Timeout kommt?
  INET_REDIRECT_MAX = 10; // Maximale Redirect-Tiefe
begin
 with tIdHttp.create(nil) do begin // Create Indy http object
  request.userAgent := INET_USERAGENT; // Custom user agent string
  redirectMaximum := INET_REDIRECT_MAX; // Maximum redirects
  handleRedirects := INET_REDIRECT_MAX<>0; // Handle redirects
  readTimeOut := INET_TIMEOUT_SECS*1000; // Read timeout msec
  try // Catch errors
   Result := Get(xUrl); // Do the request
   if URL.Port = '80then URL.Port := ''; // Remove port 80 from final URL
   xUrl := URL.GetFullURI // Return final URL <<- da könnte nun eine andere URL stehen als wie Du eingegeben hast
  except // Return an error message if failed
    on E: Exception do
    Result := 'Error! HTTP Adress: ' +xUrl+ #13#10 + 'E.Message: ' + E.Message; // Return Error Message
  end;
  free // Free the http object
 end
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  temp1, temp2: ansiString;
  i : Integer;
begin
  Memo1.Clear;
  Memo1.Lines.Add('Working...');
  Temp1 := Edit1.Text;
  if Length(Edit1.Text) > 0 then Temp2 := DownloadHTMLSource(Temp1);
  // hier noch irgendwas mit ansiString anstellen, zum Beispiel nullen entfernen
  for I := 1 to Length(Temp2) do
    if Temp2[i] = Char(Ord($00)) then Temp2[i] := Char(Ord($20));
  Memo1.Lines.Text := Temp2;
  Memo1.Lines.Add('HTTP HTML Source from: '+Temp1);
end;
Alles noch unoptimiert aber vielleicht ist es ja das was Du wolltest?
Viel Spass damit.
Ps: Diesen Code solltest Du in einem leeren Projekt testen ohne Indy Komponenten aufm Formular aber in Uses.
Gruß vom KodeZwerg

Geändert von KodeZwerg (27. Apr 2018 um 19:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft

  Alt 27. Apr 2018, 21:11
Zitat:
DownloadHTMLSource(var xUrl : ansiString): ansiString;
Das kann schon mal nichts werden
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft

  Alt 27. Apr 2018, 21:29
Zitat:
DownloadHTMLSource(var xUrl : ansiString): ansiString;
Das kann schon mal nichts werden
Sorry und sorry, 1. weil ja falsch und 2. weil ich nicht dahinter komme warum ich ansiString nicht als puffer nehmen sollte. Ich mach mich hier bestimmt gerade voll zum Honk aber bitte erleuchte mich damit ich aus meinen Fehlern auch lernen kann. Danke & nochmal sorry für den falschen Code!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft

  Alt 27. Apr 2018, 21:53
Siehe Bild.

Und 0-Bytes aus einem AnsiString rauszufiltern ist nie Sinn der Sache.
Angehängte Grafiken
Dateityp: jpg Unterschied.jpg (106,9 KB, 12x aufgerufen)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Mit IdHTTP Seite aufrufen und an MemoryStream übergeben = Zeichen fehlerhaft

  Alt 27. Apr 2018, 22:04
Ohhh oder viel besser Uhhhnicode ok, ich fange an zu verstehen und lerne daraus, Danke!

edit
Ich habe mal eine mini-Kontrolle eingebaut um zu schauen ob was verloren geht, Memo1 scheint bei diesen Korea Zeichen mehr Chars zu verwenden als reinkommen oder ist das wegen CRLF?
Delphi-Quellcode:
  i := Length(Memo1.Lines.Text) ;
  Memo1.Lines.Add('HTTP HTML Source from: '+Temp1);
  Memo1.Lines.Add('Downloaded: '+IntToStr(Length(Temp2)) +' bytes, displaying: ' +IntToStr(i)+ ' chars. ' +IntToStr(Length(Temp2)-i)+ ' bytes are lost!');
Zitat:
HTTP HTML Source from: http://www.visitkorea.or.kr/intro.html
Downloaded: 7263 bytes, displaying: 7427 chars. -164 bytes are lost!
Gruß vom KodeZwerg

Geändert von KodeZwerg (27. Apr 2018 um 23:23 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz