delphiidhttp实战用法
以delphi xe2 自带indy(10.5.8.0)组件为例,分享实战中遇到的问题及解决方法。
Idhttp 重要属性
HTTPOptions := [];
属性设为空,禁止idhttp自动为post的TStringList参数编码,因为自动编码使用的是HttpApp单元下的HttpEncode,
但此函数有误,未将+,$,@这3个符号编成UrlCode。请自行改造此函数然后使用。
HTTPOptions := [hoNoParseMetaHTTPEquiv];
当遇到Get某个网页,idhttp一直会卡住的时候,请尝试此值。
提供一个会卡住的网址给大家测试:/Company/Detail/23284.html
此网址来之不易,请善加保存!哈哈!
Request.RawHeaders.FoldLength := 8192;
参数头的总长度限制,如果post的TStringList参数过长,请加大此值。否则,超长部分将不会被post。
FIdCookieMgr := TIdCookieMgr.Create(self); //TIdCookieMgr
CookieManager := FIdCookieMgr;
AllowCookies := true;
TIdCookieMgr是我改进了的TIdCookieManager,增加了保存Cookie与加载Cookie的方法。后面详细写出。
IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(self);
此为Https功能必备,它需要两个文件 libeay32.dll和ssleay32.dll,
这两个文件在阿里旺旺的安装目录里能够到。大家不必满世界了。
Request.AcceptEncoding := ‘gzip‘;
在Get与Post的时候,告诉服务器,请把数据压缩后再传给我。
Idhttp自带的解压缩功能是错误的,需要自己去下载一个 Zlib 库,然后自己解压缩。见后面。
idhttp自带的解utf-8编码也是错误的,也需要自己手动解码。见后面
HandleRedirects := true;
ProtocolVersion := pv1_1;
ReadTimeout := 5000;
ConnectTimeout := 5000;
RedirectMaximum := 5;
Request.UserAgent := sUserAgent2;
Request.Accept := sAccept;
这几个属性,不再解释。
TIdCookieMgr 实现的功能
此类从TIdCookieMgr继承而来,下面是重点。
function TIdCookieMgr.GetCookieList: TStringList;
var
C: Tcollectionitem;
begin
result := TStringList.Create;
for C in CookieCollection do
result.add((C as TIdCookie).CookieText);
end;
这是当获取到Cookie后,如何取得所有Cookie的文本。这很简单。
下面讲如何把保存后的Cookie文本加载回去
procedure TIdCookieMgr.SetCurCookies(const Value: string);
var
StrLst: TStringList;
C: TIdCookie;
uri: TIdURI;
s, t: string;
begin
StrLst := TStringList.Create;
uri := TIdURI.Create;
try
StrLst.Text := Value;
CookieCollection.Clear;
for s in StrLst do
begin
C := CookieCollection.add;
CookieCollection.AddCookie(C, uri);
C.ParseServerCookie(s, uri);
C.Domain := GetStrBetween(s, ‘Domain=‘, ‘;‘);
C.Path := GetStrBetween(s, ‘Path=‘, ‘;‘);
//GetStrBetween 请自己去实现一个。
t := GetStrBetween(s, ‘Expires=‘, ‘GMT‘) + ‘GMT‘;
C.Expires := CookieStrToLocalDateTime(t);
end;
finally
uri.Free;
StrLst.Free;
end;
end;
GetHtmlAfterOperateIdhtpp 这个函数重要,请copy下来,等会要用
用于解压Gzip,解码utf8
1 function GetHtmlAfterOperateIdhttp(AIdhttp: TIdHTTP; AStream: TStream): string;
2 var
3 BSize: Int64;
4 BOutStream: TMemoryStream;
5 TempStream: TMemoryStream;
6 rS: RawByteString; //注意这个格式
7 s: string;
8 BIsUtf8: Boolean;
9 begin
10 BSize := AStream.Size;
11
12 BOutStream := TMemoryStream.Create;
13 try
14 if BSize > 0 then
15 begin
16
17 ifdelphi app PosEx(‘GZIP‘, UpperCase(AIdhttp.Response.ContentEncoding)) > 0 then
18 begin
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论