IdHTTP组件

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的,其它都认为无效。
  我跑到Indy的主页上下载了最新的9.0.18,发现它里面改进了,是只要domain的值的从右面算和访问的地址一样的话,那么就算是有效的。
  唉,这个问题郁闷了我一天多,看了源码才明白怎么回事,苦啊...  

你可能感兴趣的:(IdHTTP组件)