Http GET请求缓存问题

Posted 想名真难

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Http 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种, 第6种

以上是关于Http GET请求缓存问题的主要内容,如果未能解决你的问题,请参考以下文章

在 AngularJS 中缓存 HTTP 'Get' 服务响应?

手动缓存Retrofit+OkHttp响应体,不再局限于Get请求缓存

http 请求 get 和post 区别

http的get和post的区别

Nginx POST 请求缓存的使用

jQuery之禁止Get请求缓存