Delphi - 如何识别URL重定向的最终结果地址?

时间:2014-01-28 22:59:41

标签: delphi http

我有一个网址,会将我带到不同的网址。这很可能是通过URL重定向实现的。我需要一种获取初始URL并确定“最终结果”页面的URL的方法。我环顾四周,推荐使用Indy组件TIdHTTP。这是最好的(也称为最简单/最简单)的方法吗?由于我对这种类型的编码几乎没有经验,如果有人要分享示例代码,我们将不胜感激。

举个例子,这是我的起始网址......

https://www.google.com/url?q=https://stackoverflow.com/questions/21392490/how-to-convert-date-time-into-date-using-netezza&ct=ga&cd=MTAwODU3OTM3OTYxNDU5ODk3Nw&cad=CAEYAA&usg=AFQjCNHTTseazfoavOyO68Kr8izCswpj_g

由于

1 个答案:

答案 0 :(得分:1)

我建议执行一个简单的get请求并处理OnRedirect事件以保存已重定向到的最后一个地址。如果需要,您还可以保存中间地址。

我写了一个小类来处理它,在你的项目范围内,你可能会将这些方法添加到需要结果的类中,而不是封装它。

  TRedirectTester = class
  private
    Address: string;
    procedure RedirectProc(Sender: TObject; var dest: string;
      var NumRedirect: Integer; var Handled: boolean; var VMethod: TIdHTTPMethod);
  public
    function RedirectionResult(InitialURL: string): string;
  end;

我定义了一个公共函数,用于在重定向后返回最终URL,并将私有过程分配给OnRedirect事件(因此签名)和一个用于存储重定向目标的变量。

关于实施,请记住将HandleRedirects设置为true以启用重定向,必须分配IOHandler才能处理HTTPS。每次重定向发生时,都会调用分配给OnRedirect事件的方法,因此我们可以保存目标。

procedure TRedirectTester.RedirectProc(Sender: TObject; var dest: string;
  var NumRedirect: Integer; var Handled: boolean; var VMethod: TIdHTTPMethod);
begin
  Address := dest;
end;

function TRedirectTester.RedirectionResult(InitialURL: string): string;
  var IdHttp: TIdHTTP;
begin
  Address := InitialURL;
  IdHttp := TIdHTTP.Create(nil);
  try
    with IdHttp do
    begin
      HandleRedirects := true;
      OnRedirect := RedirectProc;
      IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create;
      try
        Get(InitialURL);
      finally
        IOHandler.Free;
      end;
    end;
  finally
    IdHttp.Free;
  end;
  Result := Address;
end;