14

我的网络服务器中有一个文件,每次访问它时我都会将其下载到我的应用程序中,因为文件内容可能会被更改但如果它被更改,我只想下载那个时间,这样可以节省带宽,幸运的是这就是此ETagIf-None-Match 标头字段用于。

  • 当我第一次发出请求时,我从 HTTP 响应标头中检索ETag

第一次请求文件

  • 在随后的下载该文件的请求中,我会附加If-None-Match 标头字段的Etag值,这样如果没有更改,那么我会得到 HTTP 响应状态代码 304,否则如果有,我会得到 200文件中的更改。

    第二次请求同一文件

笔记:

当我在 chrome 中的Advanced REST Client Application中尝试上述步骤时,它可以正常工作,但是当我在 iOS 中尝试时,我总是得到响应代码 200,但它应该给我 304 用于后续请求。

这是我使用的示例代码

var request1 =  NSMutableURLRequest(URL:NSURL(string: "http://10.12.1.101/Etag/ringtone1.mp3")!)
let Etagvalue="\"36170-52c1cc36d9b40\""
var session1 = NSURLSession.sharedSession()
request1.HTTPMethod = "GET"
var err: NSError?
request1.addValue(Etagvalue, forHTTPHeaderField: "If-None-Match")

var task = session1.dataTaskWithRequest(request1, completionHandler: {data, response, error -> Void in
       print("response: \(response)")

})

这是回复

响应:可选({ URL: http: //10.12.1.101/Etag/ringtone1.mp3 } {状态代码:200,标头{“接受范围”=字节;连接=“保持活动”;“内容长度” = 221552;“内容类型”=“音频/mpeg”;日期=“格林威治标准时间 2016 年 2 月 24 日星期三 14:57:53”;Etag =“\”36170-52c1cc36d9b40\“”;“保持活动”=“ timeout=5, max=100"; "Last-Modified" = "Fri, 19 Feb 2016 10:15:33 GMT"; Server = "Apache/2.4.16 (Unix) PHP/5.5.29"; } })

我在这里做错了什么?

4

3 回答 3

17

我遇到了同样的问题。我发现这是因为cachePolicy. 您需要按如下方式进行设置:

request.cachePolicy = .ReloadIgnoringLocalAndRemoteCacheData

你会没事的

于 2016-09-06T06:20:11.153 回答
2

CachePolicy 命名约定令人困惑并且更好,但它实际上并没有实现其中的一些......

这篇文章很好地解释了它们。http://nshipster.com/nsurlcache/

此外,如果您让缓存策略使用,UseProtocolCachePolicy那么您的 NSURLSession 将收到状态代码200以及从缓存生成的响应。

于 2017-03-30T21:37:15.583 回答
0

此问题是由于缓存策略“useProtocolCachePolicy”、“returnCacheDataElseLoad”或“returnCacheDataDontLoad”造成的。

您可以使用任何其他策略然后以上一个。最好是“reloadIgnoringLocalAndRemoteCacheData”。

于 2021-05-19T22:07:09.570 回答