使用 Nsurlsession 缓存响应发布请求

Posted

技术标签:

【中文标题】使用 Nsurlsession 缓存响应发布请求【英文标题】:Post Request using Nsurlsession Cache response 【发布时间】:2015-11-23 12:29:44 【问题描述】:

当我尝试使用 nsurlsession 调用 post 请求时无法缓存响应。请帮帮我。

提前致谢

【问题讨论】:

我希望它可以帮助***.com/questions/21957378/… 【参考方案1】:

根据 HTTP 规范,POST 请求不是幂等的。具体来说:

它们可能会产生副作用(例如将数据存储在数据库中)。 第二次执行 POST 不一定返回与第一次执行请求相同的结果。

因此,NSURL 系列 API 默认拒绝缓存 POST 请求。

有一些方法可以通过创建自定义 NSURLProtocol 对象来显式缓存请求。如果您沿着该路径前进,您必须在进入缓存的过程中重写 URL,以将 POST 正文数据(或其某些部分)作为 URL 的一部分包含在内。如果您不这样做,您将获得与该 URL 的每个 POST 请求相同的缓存响应,而不管实际的 POST 正文内容如何,​​这可能不是您想要的。

话虽如此,缓存 POST 请求几乎从来都不是正确的做法。如果要缓存,请使用 GET 请求。

【讨论】:

【参考方案2】:

虽然dgatwood 的回答确实有道理(POST 请求不是幂等的,因此不应被缓存),但我不得不不同意 NSURLCache 的行为。

根据我的经验,NSURLCache 缓存 POST 请求。

如果您查看应用程序的Library/Caches/< App-BundleID >/ 目录中的Cache.db 文件,就会发现这一点。此外,POST 缓存的响应 ARE 实际上是由 NSURLCache 的 - (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request 方法返回的。

您可以在Kumar Saurabh 对您的问题的评论中找到您的回复未缓存的其他可能原因,或者我在此处的回答:NSURLCache: inconsistent behaviour

【讨论】:

以上是关于使用 Nsurlsession 缓存响应发布请求的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession实现文件上传

NSURLSession POST 方法没有正确获得响应

使用 NSURLSession 设置 cookie

如何在 Swift 中发出 NSURLSession POST 请求

#iOS问题记录#关于NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)

iOS9 - NSURLSession 无法解析响应但 AlamoFire 工作