2017-07-07 3 views
0

Ich habe einen txt auf meiner Website hochgeladen, wo der Inhalt dieser TXT-Datei meine Noip-Adresse ist, die von einer http-Anfrage konsultiert werden muss.Fehler bei der Überprüfung meines Noip in einen Host hochgeladen (als Inhalt der txt-Datei)

Das Problem in meinem Code unten ist, dass, wenn diese Datei von der Site entfernt wurde, eine Ausnahme generiert wird und nicht möglich ist, führen Sie die folgenden Zeilen für die Funktion gibt ein richtiges Ergebnis zurück.

Wie lösen Sie es?

program Project1; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    idhttp, 
    SysUtils; 

function GetURLAsString(const aURL, bURL: string): string; 
var 
    lHTTP: TIdHTTP; 
    a, b: string; 
begin 
    lHTTP := TIdHTTP.Create(nil); 
    try 
    a := lHTTP.Get(aURL); 
    if lhttp.responsecode = 200 then 
     begin 
     Result := a 
     end 
     else 
     begin 
     b := lHTTP.Get(bURL); 
     if lHTTP.ResponseCode = 200 then 
     Result := b 
     else 
     Result := 'mydnsname.ddns.net'; 
     end; 
    finally 
    lHTTP.Free; 
    end; 
end; 

begin 
    try 
    GetURLAsString('http://www.mysite01.com/conn.txt','http://www.mysite02.com/conn.txt'); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    Readln; 
end. 

danke im voraus.

EDIT

das Ergebnis GetURLAsString muss 'mydnsname.ddns.net' sein, wenn einige zwei Anforderung fehlschlagen. Andernfalls muss das Ergebnis Inhalt der TXT-Datei sein, die auf meiner Website hochgeladen wird (das ist das gleiche mydnsname.ddns.net).

+0

Sie sagen, die Funktion GetURLAsString keine Ausnahme erzeugen, wenn die Datei fehlt? Wenn ja, dann hebe einfach eine Ausnahme auf, anstatt 'mydnsname.ddns.net' dem Ergebnis zuzuweisen. Oder verwenden Sie keine Ausnahmen und testen Sie das Ergebnis für diese Zeichenfolge. Oder ändern Sie die Zeichenfolge in eine leere Zeichenfolge und testen Sie dafür. – Dsm

+0

Dann tut mir leid, aber was ist deine Frage? – Dsm

+0

Willst du sagen, LHTTP.Get (aURL) erzeugt in diesem Fall eine Ausnahme? – Dsm

Antwort

4

Standardmäßig löst TIdHTTP eine EIdHTTPProtocolException Ausnahme aus, wenn der HTTP-Server einen Fehlerantwortcode wie 404 NOT FOUND zurückgibt.

Es gibt verschiedene Möglichkeiten, wie Sie damit umgehen:

  1. fangen die Ausnahme:

    function GetURLAsString(const aURL, bURL: string): string; 
    var 
        lHTTP: TIdHTTP; 
    begin 
        lHTTP := TIdHTTP.Create(nil); 
        try 
        try 
         Result := lHTTP.Get(aURL); 
        except 
         try 
         Result := lHTTP.Get(bURL); 
         except 
         Result := 'mydnsname.ddns.net'; 
         end; 
        end; 
        finally 
        lHTTP.Free; 
        end; 
    end; 
    
  2. Pass 404 im AIgnoreReplies Parameter von Get() so wird die Ausnahme nicht auf 404-Fehler angehoben , aber immer noch bei anderen Fehlern ausgelöst:

    function GetURLAsString(const aURL, bURL: string): string; 
    var 
        lHTTP: TIdHTTP; 
    begin 
        lHTTP := TIdHTTP.Create(nil); 
        try    
        Result := lHTTP.Get(aURL, [404]); 
        if lHTTP.ResponseCode = 200 then Exit; 
        Result := lHTTP.Get(bURL, [404]); 
        if lHTTP.ResponseCode = 200 then Exit; 
        Result := 'mydnsname.ddns.net'; 
        finally 
        lHTTP.Free; 
        end; 
    end; 
    
  3. Aktivieren Sie die hoNoProtocolErrorException Flagge in der HTTPOptions Eigenschaft so die Ausnahme überhaupt nicht angehoben wird:

    function GetURLAsString(const aURL, bURL: string): string; 
    var 
        lHTTP: TIdHTTP; 
    begin 
        lHTTP := TIdHTTP.Create(nil); 
        try 
        lHTTP.HTTPOptions := lHTTP.HTTPOptions + [HoNoProtocolErrorException];  
        Result := lHTTP.Get(aURL); 
        if lHTTP.ResponseCode = 200 then Exit; 
        Result := lHTTP.Get(bURL); 
        if lHTTP.ResponseCode = 200 then Exit; 
        Result := 'mydnsname.ddns.net'; 
        finally 
        lHTTP.Free; 
        end; 
    end; 
    
+0

Vielen Dank, es hat funktioniert. –

Verwandte Themen