在iOS上使用Delphi XE5。
我正在尝试使用以下内容从服务器获取一个简单的文本文件:
filename := DocumentDir + theFile.txt;
myFile := TFileStream.Create(filename, fmCreate);
aIDHTTP := TIdHTTP.Create(nil);
aIdHTTP.Get('http://www.TheServer.dk/TheDir/theFile', myFile);
稍后填充ListView
sl := TStringList.Create;
sl.loadFromFile(filename, TEncoding.ANSI);
ListView1.clear;
for i := 0 to sl.count - 1 do
begin
aItem := Listview1.add;
aItem.text := sl[i];
end;
它实际上运行正常,但是当我更改服务器上文件的内容时,我在重新运行代码时会在listview中获取旧数据。
我是否需要在某处清除缓存,如果是这样的话......我该怎么做?
提前感谢您的帮助。 亲切的问候 Jens Fudge
答案 0 :(得分:1)
TIdHTTP.GET
内置了缓存。
如果TIdHTTP
正在缓存,它将发送一个条件get(使用If-Modified-Since
标头),如果服务器正在合作,它将从发送回来的HTTP 304
响应服务器。如果是这种情况,通常情况下,您的Web服务器将能够检测到文件已更改,并且不会返回304
,而是提供最新版本的文件。如果这是问题,而且很可能不是,那么它将指向您在服务器上解决的问题。
如果您在使用TIdHTTP.GET
的客户端和服务器之间遇到缓存问题,则客户端可能会在到达Web之前通过缓存Web代理(您可能甚至不知道它)服务器。通常,ISP实施缓存Web代理以降低其带宽成本。
要通知缓存机制不响应缓存响应,您可以尝试包含Cache-Control: no-cache
标头,或者为了向后兼容HTTP / 1.0,您可以指定Pragma: no-cache
标头。如果这些都不适合你,你可能必须变得更加复杂。
正如whsrdaddy建议的那样,打败过热的网络缓存代理的一种方法是发送一个额外的参数,该参数在每个请求上发生变化,例如日期和时间(低至毫秒)或随机生成的值。这样,缓存Web代理会将请求转发到Web服务器,而不是仅仅因为URL更改而提供缓存结果。
POST
请求没有相同的问题,因此每当向服务器发送数据(修改)时务必使用POST
,并且在请求资源时仅使用GET
(读取只)。