delphi idhttp 实战用法

以delphi xe2 自带indy(10.5.8.0)组件为例,分享实战中遇到的问题及解决方法。

Idhttp 重要属性

HTTPOptions := [];

属性设为空,禁止idhttp自动为post的TStringList参数编码,因为自动编码使用的是HttpApp单元下的HttpEncode,

但此函数有误,未将+,$,@这3个符号编成UrlCode。请自行改造此函数然后使用。

HTTPOptions := [hoNoParseMetaHTTPEquiv];

当遇到Get某个网页,idhttp一直会卡住的时候,请尝试此值。

提供一个会卡住的网址给大家测试:http://www.bf35.com/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       if PosEx(‘GZIP‘, UpperCase(AIdhttp.Response.ContentEncoding)) > 0 then
18       begin
19         AStream.Position := 0;
           ZDecompressStream2(AStream, BOutStream, 31);       //这个函数在Zlib库的 ZLibEx.pas中,请自行去下载. 31 这个参数,是搜了很多资料才找到的,不知道为什么。免费送给大家用了。
21         TempStream := BOutStream;
22       end
23       else
24         TempStream := TMemoryStream(AStream);
25
26       BSize := TempStream.Size;
27       SetLength(rS, BSize);
28       TempStream.Position := 0;
29       TempStream.ReadBuffer(rS[1], BSize);
30
31       s := string(rS);
32
33       BIsUtf8 := PosEx(‘UTF-8‘, UpperCase(AIdhttp.Response.CharSet)) > 0;
34
35       BIsUtf8 := BIsUtf8 or (PosEx(‘charset="utf-8"‘, s) > 0);
36       BIsUtf8 := BIsUtf8 or (PosEx(‘charset=utf-8‘, s) > 0);         //判断代码是不是Utf8 不是很严谨,请自动修改后使用
37
38       if PosEx(‘GBK‘, UpperCase(AIdhttp.Response.CharSet)) > 0 then
39       begin
40         BIsUtf8 := false;
41       end;
42
43       if BIsUtf8 then
44         result := UTF8ToString(rS)           //注意rS的类型
45       else
46         result := s;
47
48     end
49   finally
50     BOutStream.Free;
51   end;
52
53 end;

下面给出三个操作idhttp的函数,用它们就很方便了.

function IdhttpGet(AIdhttp: TIdHTTP; const AUrl: string; var AHtml: string): Boolean;
var
  BStrStream: TMemoryStream;
begin
  AHtml := ‘‘;
  BStrStream := TMemoryStream.Create;
  try
    try
      AIdhttp.Get(AUrl, BStrStream);
      AHtml := GetHtmlAfterOperateIdhttp(AIdhttp, BStrStream);
      result := true;
    except
      on e: Exception do
      begin
        result := false;
        AHtml := e.Message;
      end;
    end;
  finally
    BStrStream.Free;
  end;
end;

function IdhttpPost(AIdhttp: TIdHTTP; AStrList: TStringList; const AUrl: string; var AHtml: String): Boolean; overload;
var
  BStrStream: TMemoryStream;
begin
  result := true;
  AHtml := ‘‘;
  BStrStream := TMemoryStream.Create;
  try
    try
      AIdhttp.Post(AUrl, AStrList, BStrStream);
      AHtml := GetHtmlAfterOperateIdhttp(AIdhttp, BStrStream);
    except
      on e: Exception do
      begin
        AHtml := e.Message;
        result := false;
      end;
    end;
  finally
    BStrStream.Free;
  end;
end;

function IdhttpPost(AIdhttp: TIdHTTP; AIdMul: TIdMultiPartFormDataStream; const AUrl: string; var AHtml: string)
  : Boolean; overload;

var
  BStrStream: TMemoryStream;
begin
  result := true;
  AHtml := ‘‘;
  BStrStream := TMemoryStream.Create;
  try
    try
      AIdhttp.Post(AUrl, AIdMul, BStrStream);
      AHtml := GetHtmlAfterOperateIdhttp(AIdhttp, BStrStream);
    except
      on e: Exception do
      begin
        AHtml := e.Message;
        result := false;
      end;
    end;
  finally
    BStrStream.Free;
  end;
end;

别急,还有。如何手工给post参数编码

请自己改造HttpEncode函数,可以是像我这样子的.

function HttpEncodeX(const AStr: string): string;
var
s: string;
begin

s := String(HttpEncode(AnsiString(UTF8Encode(AStr))));

//通常来说,如果参数有中文,是先编成Utf8再urlEncode的。请看清后再使用.

s := ReplaceAll(s, ‘+‘, ‘%20‘); //此函数请去网上搜一个.

   s := ReplaceAll(s, ‘$‘, ‘%24‘);

   Result := ReplaceAll(s, ‘@‘, ‘%40‘);

end;

编码方法:

var

BStrs:TSTringList;

begin

BStrs:=TStringlist.Create;

BStrs.add(‘name=‘+HttpEncodeX(‘晓不得abc‘));

BStrs.add( HttpEncodeX(‘na$me‘)+‘=‘+HttpEncodeX(‘晓不得abc‘));

//切记,这里的等号用原型,不要编码。idhttp会自动把等号翻译成 & 放在请求头中.

end;

好了,over,祝大家编的外挂功能越来越好用!

 

时间: 2024-11-10 14:11:10

delphi idhttp 实战用法的相关文章

delphi idhttp 实战用法(TIdhttpEx)

以delphi XE8 自带indy(10.5.8.0)组件为例,分享实战中遇到的问题及解决方法. TIdHttpEx 用法实例01[多线程获取网页](包含完整源码) 实例02(如何Post参数,如何保存与提取Cookie)待写 TIdHttpEx 已实现了对GZIP的解压,对UTF-8编码解码等 本文包含以下几个单元 uIdhttp.pas (TIdHttpEx) uIdCookieMgr.pas (TIdCookieMgr) uOperateIndy.pas 操作 TIdhttpEx 全靠它

delphi 线程实战用法

新版delphi,带有匿名函数功能,大大方便了使用者. 现使用匿名函数开发一个方便实用的线程类,简化线程调用. 1. uSyncObjs.pas,TSuperEvent对TEvent的改进 2. uThreadTList, 对TList的改进 3. uSuperThreadCommon.pas,公共类,继承TThreadList,带自动释放 4. uSuperThreadHelper.pas, 由TThread线程继承而来,一个方便的单独线程类,平时用它可以快速实现线程功能. 5. uSuper

Delphi ListView基本用法大全[delphi]

Delphi ListView基本用法大全 本文出处:http://hi.baidu.com/python120/item/4ea85f61af94e55b6895e6ac //增加项或列(字段) ListView1.Clear;ListView1.Columns.Clear;ListView1.Columns.Add;ListView1.Columns.Add;ListView1.Columns.Add;ListView1.Columns.Items[0].Caption:='id';List

Delphi Inputbox,InputQuery用法

Delphi :InputQuery,InputBox用法及区别 function InputQuery(const ACaption, APrompt: string; var Value: string): Boolean; InputQuery返回值为是否点了OK 输入的字符串放在了变量Value中 function InputBox(const ACaption, APrompt, ADefault: string): string; inputBox返回值是字符串,也就是输入的字符串

Delphi IdHttp组件+IdHttpServer组件实现文件下载服务

http://blog.csdn.net/xxkku521/article/details/16864759 Delphi IdHttp组件+IdHttpServer组件实现文件下载服务 2013-11-21 18:15 2624人阅读 评论(0) 收藏 举报  分类: DELPHI(10)  版权声明:本文为博主原创文章,未经博主允许不得转载. [delphi] view plain copy uses idhttp,IdHTTPServer; //idhttp组件提交下载请求 procedu

为何没有人用DELPHI IDHTTP + WEB做三层应用

---恢复内容开始--- 为何没有人用DELPHI IDHTTP + WEB + MYSQL(或其他数据库)做三层应用,我个人觉得这样做也不错.不过这样写需要开发人员懂的范围相对广一些,对于初入门的朋友来说,可能有点困难.需要对PHP或其他WEB框架有所认识,了解并懂得如何使用JSON. 现在JSON应用得这么广泛,DELPHI也支持(XE10肯定支持,其他版本不清楚,请自行测试). ThinkPHP是一个挺成熟的PHP框架,用它来做WEB层(服务层)是不错的选择,当然可以用其他的,例如JAVA

(转载)Delphi TStringList的用法

Delphi TStringList的用法 统一转换成Utf8AnsiToUtf8(sTmp);AnsiToUtf8('啊'); 或2010以上版本,全是UTF8了 TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. TStringList 常用方法与属性: var List: TStringList; i: Integer; begin List := TStringList.Create; List.Add('Strings1'); {添加} List.Add('S

Delphi IDHTTP用法详解

[delphi] view plaincopyprint? 一.IDHTTP的基本用法 IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等 IDHttp的创建,需要引入IDHttp procedure InitHttp(); begin http := TIdHTTP.Create(nil); http.ReadTimeout := 30000; http.OnRedirect := OnRedirect;

Delphi GDI+基本用法总结

GDI+以前只是听说过,还没怎么用过,这段时间用了用,觉得挺好用的.在这里总结一下.留个备忘. GDI+(Graphics Device Interface plus)是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口.由于它是图形绘制相关的接口,那先了解一下常用的几种图片格式. 常见的图片格式 常见的图片格式有JPEG, BMP, PNG. - JPEG:它用有损压缩方式去除冗余的图像或彩色数据, 获取得极高的压缩率的同