我的 webserver 中有一个文件,我每次访问时都会将其下载到我的应用程序,因为它可能会更改文件内容但是如果它被更改我想下载那个时间只有这样才能节省带宽,幸运的是, ETag 和 If-None-Match 标题字段的目的是什么。
注意:的
当我在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 ;; }})
我在这里做错了什么?
答案 0 :(得分:10)
我遇到了同样的问题。我发现这是因为cachePolicy
。您需要按如下方式设置它:
request.cachePolicy = .ReloadIgnoringLocalAndRemoteCacheData
你会没事的
答案 1 :(得分:1)
CachePolicy命名约定令人困惑,但实际上并没有实现其中的一些......
这篇文章很好地解释了它们。 http://nshipster.com/nsurlcache/
此外,如果您让缓存策略使用UseProtocolCachePolicy
,那么您的NSURLSession将收到状态代码200
,其中包含从缓存生成的响应。
答案 2 :(得分:0)
此问题是由于缓存策略“useProtocolCachePolicy”、“returnCacheDataElseLoad”或“returnCacheDataDontLoad”所致。
您可以使用任何其他政策,然后是上述政策。最好是“reloadIgnoringLocalAndRemoteCacheData”。