Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   URL checken (https://www.delphipraxis.net/176271-url-checken.html)

Privateer3000 23. Aug 2013 07:59

URL checken
 
Hallöchen,
ich erstelle mal zu diesem Thema einen neuen Thread.
Und zwar geht es um das Beispiel von Marabu:
Code:
function Tmain.urlcheck(sUrl: String; bAllowRedirects: Boolean = false): Integer;
begin
   with IdHTTP1 do
   try
     try
       HandleRedirects := bAllowRedirects;
       Head(sUrl);
       Result := Response.ResponseCode;
     finally
       Free;
     end;
   except
       Result := GetLastError;
   end;
end;
Wenn nun die Funktion mit
Code:
urlcheck('http://www.delphipraxis.net', true) = 200
aufgerufen wird, funktioniert das.
Aber nur einmal. Lässt man einen Timer regelmäßig diese Funktion aufrufen
gibt es eine Exception beim zweiten Mal.

Warum passiert das?

DeddyH 23. Aug 2013 08:23

AW: URL checken
 
Durch das Free ist IdHTTP1 ja gar nicht mehr existent, daher muss ja jeder weitere Zugriff scheitern. Hast Du evtl. Code ausgelassen, ich kann mir nicht vorstellen, dass Achim so ein Klopper passiert sein soll?

[edit] Du kannst es aber auch mal so versuchen (ohne Indy):
Delphi-Quellcode:
uses WinInet;

function IsUrlValid(const sUrl: string; CheckTimeout: DWORD = 3000): Boolean;
var
  hInet, hConnect: HINTERNET;
  StatusCode, dummy, bufLen, Option: DWORD;
begin
  Result := False;
  hInet := InternetOpen(PChar(Application.Title),
    INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, nil, nil, 0);
  if Assigned(hInet) then
    try
      Option := CheckTimeout;
      InternetSetOption(hInet, INTERNET_OPTION_CONNECT_TIMEOUT, @Option,
        SizeOf(Option));
      InternetSetOption(hInet, INTERNET_OPTION_RECEIVE_TIMEOUT, @Option,
        SizeOf(Option));
      hConnect := InternetOpenUrl(hInet, PChar(trim(sUrl)), nil, 0,
        INTERNET_FLAG_NO_UI, 0);
      if Assigned(hConnect) then
        try
          dummy := 0;
          bufLen := SizeOf(StatusCode);
          if HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE or
            HTTP_QUERY_FLAG_NUMBER, @StatusCode, bufLen, dummy) then
            Result := StatusCode = HTTP_STATUS_OK;
        finally
          InternetCloseHandle(hConnect);
        end;
    finally
      InternetCloseHandle(hInet);
    end;
end;
Das setzt zwar einen installierten InternetExplorer voraus, aber davon kann man wohl ausgehen.[/edit]

Privateer3000 23. Aug 2013 12:21

AW: URL checken
 
Vielen Dank dafür!
Dieses funtkioniert,
ich weiß zwar nicht wie, aber es funktioniert.
Von der Materie hab ich echt keinen Schimmer.
Apropos:
Code:
Result := StatusCode = HTTP_STATUS_OK;
Läßt sich das ganze so modifizieren dass es den Statuscode zurückgibt?


Grüße

DeddyH 23. Aug 2013 12:48

AW: URL checken
 
Klar, deklariere statt Boolean DWORD als Rückgabewert, initialisiere mit 0 und ändere besagte Zeile in
Delphi-Quellcode:
Result := StatusCode;

Privateer3000 23. Aug 2013 19:22

AW: URL checken
 
Ha! Das hab ich sogar verstanden :)

Danke und schönes Wochenende!

Privateer3000 24. Aug 2013 14:18

AW: URL checken
 
Also irgendwas stimmt da nicht.
Ich bekomme immer ein "OK" auch wenn die URL ungültig ist:
Delphi-Quellcode:
function urlcheck(const sUrl: string; CheckTimeout: DWORD = 3000): DWORD;
var
   hInet, hConnect: HINTERNET;
   StatusCode, dummy, bufLen, Option: DWORD;
begin
   Result := 0;
   hInet := InternetOpen(PChar(Application.Title),
     INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, nil, nil, 0);
   if Assigned(hInet) then
     try
       Option := CheckTimeout;
       InternetSetOption(hInet, INTERNET_OPTION_CONNECT_TIMEOUT, @Option,
         SizeOf(Option));
       InternetSetOption(hInet, INTERNET_OPTION_RECEIVE_TIMEOUT, @Option,
         SizeOf(Option));
       hConnect := InternetOpenUrl(hInet, PChar(trim(sUrl)), nil, 0,
         INTERNET_FLAG_NO_UI, 0);
       if Assigned(hConnect) then
         try
           dummy := 0;
           bufLen := SizeOf(StatusCode);
           if HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE or
             HTTP_QUERY_FLAG_NUMBER, @StatusCode, bufLen, dummy) then
             Result := StatusCode;
         finally
           InternetCloseHandle(hConnect);
         end;
     finally
       InternetCloseHandle(hInet);
     end;
end;

function htcodes(mycode: Integer): string;
begin
   case mycode of
     200: Result := 'OK';
     301: Result := 'Adresse umgezogen';
     400: Result := 'Anfrage fehlerhaft';
     401: Result := 'keine Authentifizierung';
     403: Result := 'keine Berechtigung';
     404: Result := 'Keine Antwort';
     408: Result := 'Timeout';
     else
       Result := 'unbekannter Fehler';
   end;
end;
Aufruf:
Delphi-Quellcode:
procedure Tmain.testbuttonClick(Sender: TObject);
var stc: Integer;
begin
 stc:=urlcheck(urltext.Text);
 Showmessage(htcodes(stc));
end;
Theoretisch gibt es also immer eine 200 zurück.
Mache ich was falsch?

DeddyH 24. Aug 2013 14:29

AW: URL checken
 
Bei mir funktioniert der Code, unter Delphi 7 ausprobiert.

Privateer3000 24. Aug 2013 15:08

AW: URL checken
 
Seltsam
selbst wenn ich den größten Blödsinn reinschreibe
meldet es OK. Hauptsache ich schreibe überhaupt was rein.
Ist urltext.text leer kommt unbekannter Fehler, also die else vom case.
Wie kann es bei dir funktionieren?

DeddyH 24. Aug 2013 15:25

AW: URL checken
 
Bist Du mal durchgesteppt? Ich habe unter Windows kein Lazarus zur Verfügung, unter Linux kann ich ja WinInet schlecht benutzen.

Privateer3000 24. Aug 2013 17:19

AW: URL checken
 
Auch wenn bei mir inzwischen FPC/Lazarus steht,
das nutze ich hauptsächlich, habe ich das hier
in meinem alten D7 gemacht. Also unter quasi gleichen Bedingungen.
Hätte ich vllt. dazuschreiben sollen, sry :(

Aber ich setze mal einen Haltepunkt, mal sehen wo
die Routine hinspringt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr.
Seite 1 von 2  1 2      

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