检查我在主机上传的Noip时出错(作为txt文件内容)

时间:2017-07-07 14:19:20

标签: delphi httprequest idhttp

我在我的网站上传了一个txt,其中这个txt文件的内容是我的Noip地址,必须通过http请求查询。

下面我的代码中的问题是,如果删除了该文件的网站,则会生成异常而不能执行以下行的函数返回正确的结果。

如何解决?

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.

提前感谢。

修改

GetURLAsString 的结果必须是' mydnsname.ddns.net ',如果有两个请求失败的话。否则,结果必须是我网站上传的txt文件的内容(即 mydnsname.ddns.net )。

1 个答案:

答案 0 :(得分:4)

按照设计,如果HTTP服务器返回失败响应代码,TIdHTTP默认会引发EIdHTTPProtocolException异常,例如404 NOT FOUND

有几种不同的方法可以解决这个问题:

  1. 抓住例外:

    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. AIgnoreReplies Get()参数中传递404,因此404错误不会引发异常,但仍会引发其他错误:

    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. hoNoProtocolErrorException属性中启用HTTPOptions标志,以便根本不会引发异常:

    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;