Http GET请求缓存问题

简介:iOS 客户端在使用GET请求时,返回的结果是缓存

GET 缓存导致的问题

在iOS 客户端通过AFNetworking 发起 GET 方式的HTTP请求时,导致数据始终不是最新的,即使断开网络连接,依旧能获取到response,原因就是其对GET 方式进行了缓存。

HTTP缓存

HTTP缓存的基本目的就是使应用执行的更快,更易扩展,但是HTTP缓存通常只适用于idempotent request(可以理解为查询请求,也就是不更新服务端数据的请求),这也就导致了在HTTP的世界里,一般都是对GET请求做缓存,POST请求很少有缓存。

GET多用来直接获取数据,不修改数据,主要目的就是database的search语句的感觉。用缓存(有个代理服务器的概念)的目的就是查db的速度变快。

POST则是发送数据到服务器端去存储。类似db里的update delete和insert语句的感觉。更新db的意思。数据必须放在数据库,所以一般都得去访问服务器端,而极少需要缓存。

解决GET 缓存的七种方式

  • 1.服务端处理,在response的 header 中添加@{@"Cache-Control": @"no-cache, must-reva lidate"};

  • 2.客户端在header中添加@{@"If-Modified-Since": @"0"}

  • 3.客户端在header中添加@{@"Cache-Control": @"no-cache"}

  • 4.客户端在GET请求的url中添加参数@{@"timestamp": @([[NSDate date] timeIntervalSince1970]}

  • 6.用POSET替换GET请求

  • 7.iOS 可以通过使用[NSURLSessionConfiguration ephemeralSessionConfiguration]忽略缓存,如果使用的基于NSURLSession的网络请求,比如AFNetworking:

    // 忽略缓存
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
        AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:config];
    

推荐使用第4种或第7种方式

推荐阅读

目录