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">
...
我如何不能让这种文字?
当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>
除了@ 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
标志。 无论哪种方式,你将有机会获得响应头。