印地获取响应文本,而不是处理302(Indy Get response text while not

2019-10-21 00:37发布

    FHTTP.HandleRedirects := False;
    try

      StrPage := FHTTP.Get('https://somesite.site');
    except
    end;

有302重定向,但我需要得到这个传请求..回应文本:

    (Status-Line):HTTP/1.1 302 Found
    Cache-Control:no-cache, no-store
    Content-Length:148291
    Content-Type:text/html; charset=utf-8
    Date:Sun, 21 Sep 2014 09:13:49 GMT
    Expires:-1
    Location:/di
    Pragma:no-cache

作为回应:

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/di">here</a>.</h2>
</body></html>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
...

我如何不能让这种文字?

Answer 1:

HandleRedirects := False ,302状态码将导致TIdHTTP提高的EIdHTTPProtocolException例外。
该响应的内容可以通过被访问EIdHTTPProtocolException.ErrorMessage

例:

procedure TForm1.Button1Click(Sender: TObject);
var
  StrPage: string;
begin
  IdHttp1.HandleRedirects := False;
  try
    StrPage := IdHttp1.Get('http://www.gmail.com/');
  except
    on E: EIdHTTPProtocolException do
    begin
      if not ((E.ErrorCode = 301) or (E.ErrorCode = 302)) then raise;
      StrPage := E.ErrorMessage;
      ShowMessage(StrPage);
    end
    else
      raise;
  end;
end;

输出:

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://mail.google.com/mail/">here</A>.
</BODY></HTML>


Answer 2:

除了@ kobik的回答(这在技术上是准确的),还有一些额外的考虑。

你表现出响应主体文本是相当小,它提供了有用的信息的唯一真正片是包括HTML链接到URL被重定向到一个人类可读的文本消息。 如果你在URL只是有兴趣,你可以通过自己从获得它TIdHTTP.Response.Location财产,或从TIdHTTP.OnRedirect事件。 在的情况下OnRedirect ,你可以将其设置Handled参数为False跳过实际重定向,而无需设置HandleRedirets为False。

如果你不希望一个不EIdHTTPProtocolException在302中被引发的异常,您可以启用hoNoProtocolErrorException中旗TIdHTTP.HTTPOptions财产,否则打电话TIdHTTP.DoRequest()直接并在其指定302 AIgnoreReplies财产。 无论哪种方式,你可以再检查TIdHTTP.Response.ResponseCode请求退出后财产没有引发异常。 但是,如果禁用EIdHTTPProtocolException ,您无法访问正文( TIdHTTP将读取并丢弃),除非你启用hoWantProtocolErrorContent标志。 无论哪种方式,你将有机会获得响应头。



文章来源: Indy Get response text while not handling 302
标签: delphi http indy