Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

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

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

  Alt 28. Apr 2018, 00:57
Hallo nochmal,
hier zwei neue Samples die auch HTTPS Unterstützen, diesmal sollte nichts schiefgehen, aber mal abwarten was so kommt
Delphi-Quellcode:
Uses WinInet;

function GetUrlContent(const Url: string): UTF8String;
var
  NetHandle: HINTERNET;
  UrlHandle: HINTERNET;
  Buffer: array[0..1023] of byte;
  BytesRead: dWord;
  StrBuffer: UTF8String;
begin
  Result := '';
  NetHandle := InternetOpen('Delphi-PRAXiS RockZ', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(NetHandle) then
    try
      UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
      if Assigned(UrlHandle) then
        try
          repeat
            InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
            SetString(StrBuffer, PAnsiChar(@Buffer[0]), BytesRead);
            Result := Result + StrBuffer;
          until BytesRead = 0;
        finally
          InternetCloseHandle(UrlHandle);
        end
      else
        raise Exception.CreateFmt('Cannot open URL %s', [Url]);
    finally
      InternetCloseHandle(NetHandle);
    end
  else
    raise Exception.Create('Unable to initialize Wininet');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  temp1, temp2: String;
  i : Integer;
begin
  Memo1.Clear;
  Temp1 := ''; Temp2 := '';
  Memo1.Lines.Add('Downloading Data from ' +Edit1.Text);
  Memo1.Lines.Add('Please Wait...');
  Temp1 := Edit1.Text;
  if Length(Temp1) > 0 then Temp2 := GetUrlContent(Temp1);
  Memo1.Lines.Text := Temp2;
  i := Length(Memo1.Lines.Text) ;
  Memo1.Lines.Add('HTTP/S HTML Source from: '+Temp1);
  Memo1.Lines.Add('Downloaded: '+IntToStr(Length(Temp2)) +' bytes, displaying: ' +IntToStr(i)+ ' chars. ' +IntToStr(Length(Temp2)-i)+ ' bytes are different!');
end;
Und hier die WinApi Variante, sollte auch HTTPS tauglich sein.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  http: variant;
  temp1, temp2: String;
  i : Integer;
begin
  Memo1.Clear;
  Temp1 := ''; Temp2 := '';
  Memo1.Lines.Add('Downloading Data from ' +Edit1.Text);
  Memo1.Lines.Add('Please Wait...');
  Temp1 := Edit1.Text;
  http:=createoleobject('WinHttp.WinHttpRequest.5.1');
  http.open('GET', Temp1, false);
  http.send;
  Temp2 := http.responsetext;
  Memo1.Lines.Text := Temp2;
  i := Length(Memo1.Lines.Text) ;
  Memo1.Lines.Add('HTTP/S HTML Source from: '+Temp1);
  Memo1.Lines.Add('Downloaded: '+IntToStr(Length(Temp2)) +' bytes, displaying: ' +IntToStr(i)+ ' chars. ' +IntToStr(Length(Temp2)-i)+ ' bytes are different!');
end;
Total Oldschool way, ich hoffe es gefällt Dir und löst Dein Problem!
Hier der link zur Quelle.
Falls "Nullen" zum Problem werden, schau in den anderen Code und passe das so an.

edit
PS: Und es tut mir leid das ich am Titel-Thema mehr als vorbeigerauscht sein sollte (beide Samples benötigen kein Indy und beide Samples enthalten keinen MemoryStream)
PPS: Hier ein HTTPS Ergebnis
Zitat:
HTTP/S HTML Source from: https://www.delphipraxis.net/
Downloaded: 35261 bytes, displaying: 36143 chars. -882 bytes are different!
Gruß vom KodeZwerg

Geändert von KodeZwerg (28. Apr 2018 um 03:00 Uhr) Grund: Code aktualisiert
  Mit Zitat antworten Zitat