ETag和If-None-Match HTTP标头不起作用

时间:2016-02-24 16:44:57

标签: ios swift nsurlsession etag if-none-match

我的 webserver 中有一个文件,我每次访问时都会将其下载到我的应用程序,因为它可能会更改文件内容但是如果它被更改我想下载那个时间只有这样才能节省带宽,幸运的是, ETag If-None-Match 标题字段的目的是什么。

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

First time request to the file

  • 在随后的下载该文件的请求中,我附加 If-None-Match 标题字段的 Etag 值,以便在没有然后改变,我得到HTTP响应状态代码304,否则如果文件发生变化我就会得到200.

    Second time request for same file

注意:

当我在chrome中的高级REST客户端应用程序中尝试上述步骤时,它可以正常工作,但是当我在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,headers {       "接受-范围" =字节;       Connection =" Keep-Alive&#34 ;;       " Content-Length的" = 221552;       "内容类型" =" audio / mpeg&#34 ;;       日期=" 2016年2月24日星期三14:57:53 GMT&#34 ;;       Etag =" \" 36170-52c1cc36d9b40 \"&#34 ;;       "保活" ="超时= 5,最大= 100&#34 ;;       "上次修改" ="星期五,2016年2月19日10:15:33 GMT&#34 ;;       Server =" Apache / 2.4.16(Unix)PHP / 5.5.29&#34 ;; }})

我在这里做错了什么?

3 个答案:

答案 0 :(得分:10)

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

request.cachePolicy = .ReloadIgnoringLocalAndRemoteCacheData

你会没事的

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

此问题是由于缓存策略“useProtocolCachePolicy”、“returnCacheDataElseLoad”或“returnCacheDataDontLoad”所致。

您可以使用任何其他政策,然后是上述政策。最好是“reloadIgnoringLocalAndRemoteCacheData”。

相关问题