耗费了我一下午带一晚上,最终证明,Delphi7自带的Indy的组件TIdHTTP有个Bug。
下文转自
http://www.gzctu.com/blog/article.asp?id=63:
引用
IdHTTP组件是Indy组件的一部分,主要用于实现读取HTTP服务器的资源,可以实现浏览器的网络功能。
IdHTTP是从TIdCustomHTTP继承来的,基本上也就是换了一个比较简单的名字给类和属性而已,它本身没有自己的函数和过程,全是从TIdCustomHTTP继承来的。
基本上用得到的两个方法是Get(两个重载类型)和Post(四个重载类型),我这回用过的是fuction Get(AURL:String) : String和function Post(AURL:String,post:TStream):String,这两个函数返回的就是AURL指定URL上返回的HTML。所有的Get 和Post都是通过调用DoRequest实现的。但是用Post函数的时候如果发模拟一个post类型的form,一定要设 idhttp.Request.Content-Type:='application/x-www-form-urlencoded',不然会有问题。
如果接收到一个HTTP 3xx的HTTP码,那么就会产生一个OnRedirect事件,如果设定了idhttp.HandleRedirect:=false(这是默认的)的话,会产生一个EIdProtocolReplyError的例外。如果设置了这个属性为true的话,它会自动根据服务器返回的重定向目标进行Get方式访问,当然也可以在OnRedirect事件的处理代码中进行进一步的处理,这个事件是在第二访问之前产生的,这个事件的处理程序会在先于Get执行。
下面再说说那个CookieManager属性,这个东西是保存IdHTTP访问网页时获得的cookie,它会自动把这些cookie检测一下,如果是有效的,就是会把它保存在CookieManager.CookieCollection里面。然后在访问一个URL的时候,再通过 CookieManager.GenerateCookieList(URI:TIdURI):String取出来发送到服务器的cookie,就放在 Header里面cookie: 后面发出去。
但是这里Delphi7安装时带的Indy9.0.10有个问题,它在验证cookie是否有效的时候,会先把从服务器中收到的Set-cookie:和Set-cookie2的行后面的cookie文本建立一个cookie,如果这个 cookie有domain字段,就检查domain的值是否与访问的地址一样,如果不一样,那么访问的地址如果是域名,就把前面的主机头去掉,留下以. 开头的域名再与domain比,如果一样就算有效,否则无效,如果访问地址是IP的话如果与domain值不一样就算无效,如果没有domain字段,那么就是有效的。显然这里有一点不对,就是如果访问地址是域名,domain值可以不以.开头,而且可能再是域名的上一结点。例如,对于从 port.fudan.edu.cn上取到的cookie,如果domain 为.fudan.edu.cn,.edu.cn,.cn,fudan.edu.cn,edu.cn都是有效的,但是它只认.fudan.edu.cn的,其它都认为无效。
注意最后一段,Indy9.0.10的IdHTTP组件只能识别如:http://member1.taobao.com/member/login.jhtml这样网址中的域cookie,如果是http://sign.im.alisoft.com/sign/tvs这样的网址,那么此版本的IdHTTP组件就无能为力了,无法识别出其中的im.alisoft.com域Cookie。需要使用更高版本的Indy控件。
我搜索了一下网络,找到了Indy v10.0.52 for Delphi7,大家可以从下面的网址下载到:
http://www.delphifans.com/SoftView/SoftView_993.html
另外,安装新版本Indy时,请参考下文:
引用
indy是一个很好开源的网络通讯套件,覆盖了TCP、HTTP、UDP、SNMP等协议,上百个控件左右。
最近的版本为:10.2.3。Remobjects 在5.0.29后也加入了支持这个indy版本。
但要替换indy是非常麻烦,原因是,delphi自动携带了低版本的indy,如D7携带了Indy9.X的版本,D2007携带了Indy 10.1.X。
我不喜欢用官方自带的安装程序来安装控件,原因是他们喜欢将编译后 indy*.BPL等文件拷贝系统system32目录,如果你不幸装了多个delphi版本的indy或有其他应用程序也在系统目录引用到 indy*.BPL,会一起一系列的麻烦。碰上这类的大型套件,最好是手动安装最好。
你必须先到indy的官方网站目录下载一个最新的 indy snapshot版本。
安装步骤如下:
1、删除delphi目录Bin下的indy*.BPL文件,这是官方旧版本的文件,放心删除(你不放心可以做备份)。
2、删除delphi目录下的 Id*.DCU文件,一般都是在lib目录里。
3、打开安装目录下的indy10\lib目录,安装DPK包顺序如下:
(1)编译 System\IndySystem110.dpk
(2)编译 Core\IndyCore110.dpk,编译安装Core\dclIndyCore110.dpk(设计包)
(3)编译 Protocols\IndyProtocols110.dpk,编译安装Protocols\dclIndyProtocols110.dpk(设计包)
4、添加路径
如果你编译时候,提示找不到单元文件,那是因为,各个包分散在不同目录,需要在工程指定搜索路径或在类库里设置路径。由于我们是长期使用indy10套件,因此在类库里设置好路径后就一劳永逸:
最后,来一点分析:
在Dephi中使用IdHTTP组件时,如果访问的网站中有Redirect的情况出现,需要将HandleRedirects属性设为true。
很多单点登录的网站中会出现网址的多次Redirect,而且会出现多个域Cookie的情况出现,Delphi7的原装IdHTTP只能解析出基础域名的Cookie域,如果出现其他的如:.edu.cn、.sso.ipcat.cn、.top.hulian56.com这样非根域的Cookie时,需要安装更高版本的Indy。显然上文已经给出了安装方法。
分享到:
相关推荐
总的来说,要在DELPHI7的IDHTTP组件中启用SSL,需要理解OpenSSL库的作用,正确配置组件属性,并确保DLL文件的可用性。这将帮助你在开发过程中建立安全的网络通信,保护用户数据不受侵犯。通过熟练掌握这些知识,你...
本篇文章将深入探讨如何在Delphi中利用IdHTTP组件进行HTTP请求的报头(Header)读写操作,这对于开发Web服务客户端、API接口调用等任务至关重要。 首先,我们需要了解HTTP报头的基本概念。HTTP报头是由键值对组成的...
在 Delphi 7 开发环境中, Indy 是一个广泛使用的网络通信库,提供了许多组件来处理各种网络协议,如 HTTP、FTP、SMTP 等。在这些组件中,`TIdHTTP` 是用来处理 HTTP 协议请求的重要组件。本示例主要讲解如何使用 `...
在Delphi 7中, Indy 是一个非常流行的网络通信组件库,其中 IDHTTP 组件是用于执行HTTP请求的核心部分。本文将深入探讨IDHTTP组件在POST请求中的8种使用方法,帮助开发者更好地理解和利用这个强大的工具。 1. **...
在Delphi 7中, Indy 是一个非常流行的网络组件库,它包含了许多用于处理HTTP通信的组件,其中IDHTTP是核心组件之一。本教程将详细阐述IDHTTP组件进行POST请求的8种不同方法,每种方法都有其特定的用途和适用场景。...
在DelphiXE中,我们可以直接在界面上拖放idHttp组件,并配置其属性,如Host、Port、Request等,以适应不同的HTTP请求需求。 其次,HttpServer组件则扮演了服务器的角色,它监听指定的端口,等待客户端的连接请求,...
Delphi 7 IdHTTP 链接 https 用到的indy动态链接库文件libeay32.dll和ssleay32.dll,是自己从官网下载测试后能用的。Windows 7 64位。在Delphi7自带的indy运行正常。
在Delphi中,使用IDHTTP组件进行POST请求时,通常涉及以下几个步骤: 1. 创建IDHTTP实例:首先,在代码中创建一个TIdHTTP对象,这将作为发送HTTP请求的基础。 ```delphi var IdHTTP: TIdHTTP; begin IdHTTP := ...
在Delphi XE开发环境中,`IdHTTP`控件是一个非常强大的组件,它允许开发者执行HTTP请求,包括GET、POST等方法。在这个例子中,我们将深入探讨如何利用`IdHTTP`进行POST请求,以及这个过程中的关键知识点。 首先,...
在Delphi XE7开发环境中,使用IDHTTP组件进行HTTPS通信时,特别是在Windows 7 64位系统下,需要依赖一些特定的动态链接库(DLL)文件来确保正确执行HTTPS请求。这些库文件提供了必要的加密和SSL/TLS支持,以实现安全...
在Delphi编程环境中,IDHTTP组件是Indy库中用于HTTP通信的重要组件,它提供了丰富的功能,如GET、POST、PUT等HTTP请求方法。当我们需要进行循环POST操作时,这通常涉及到批量数据发送或者模拟用户行为,例如提交表单...
在Delphi编程环境中,`idHttp` 和 `idHttpServer` 是两个非常重要的组件,用于实现客户端和服务器之间的数据通信。这两个组件是 Indy (Internet Direct) 库的一部分,提供了丰富的功能来处理HTTP协议的需求。 首先...
这里我们将深入探讨OpenSSL、HTTPS协议、Indy组件以及在Delphi 7中使用IDHTTP组件进行网络请求的相关知识点。 首先,OpenSSL是一个开源的加密库,它包含了各种安全协议,如SSL/TLS(用于安全网络通信)和各种加密...
在Delphi编程环境中,IdHTTP控件是一个非常重要的组件,用于执行HTTP请求,如GET、POST等。在处理网络通信时,特别是在与Web服务器交互时,Cookie管理是必不可少的一部分。Cookie通常用来存储用户状态信息,如登录...
APS (Any Persistence Service) 是一套用于Delphi开发的组件库,而IDHTTP是 Indy(Internet Direct)库中的一个关键组件,用于实现HTTP协议的客户端功能。本知识点主要探讨如何使用Delphi结合APS IDHTTP组件来实现...
在Delphi编程环境中,开发人员经常使用Indy(Internet Direct)组件库来进行网络通信,其中IDHTTP组件是用于HTTP协议操作的重要部分。本主题将深入探讨如何利用Delphi的REST组件和IDHTTP组件进行POST数据提交,这...
总的来说,libeay32.DLL和ssleay32.DLL是实现Delphi应用中IDHTTP组件SSL通信的重要组件,它们提供了OpenSSL库的加密算法和SSL/TLS协议支持。在开发过程中,确保这两个文件的可用性,并正确配置IDHTTP的SSL选项,是...
在本例中使用的 `TIdHTTP` 组件就是 Indy 库中的一个重要组成部分,用于实现 HTTP 协议相关的功能。 #### 实现步骤详解 为了获取新浪股票 API 的数据,我们需要按照以下步骤进行操作: 1. **创建 TIdHTTP 对象**:...
标题 "Delphi IDHTTP" 指的是使用 Delphi 编程语言中 IDHTTP 组件进行网络请求和数据传输的相关技术。IDHTTP 是 Indy(Internet Direct)库的一部分,这是一个广泛用于 Delphi 和 C++Builder 的网络通信组件集,用于...
在本示例中,我们探讨了如何在 Delphi XE8 中使用 IDHTTP1.get() 方法从一个基于 Servlet 3.1 的服务器获取 JSON 数据。这个过程涉及到 Delphi 客户端与 Java 服务端之间的通信,其中 JSON 用于数据交换格式。以下是...