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

我有一个文件在我的networking服务器 ,我下载到我的应用程序,每次我访问它,因为它可能的文件内容可能会改变但如果它被改变,我想下载的时间只有这样带宽可以被保存,幸好这就是这个ETagIf-None-Match 头域是用于。

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

第一次请求文件

  • 在随后的下载文件的请求中,我会附加If-None-Match headerfield的Etag值,以便如果没有改变,那么我会得到HTTP响应状态码304,否则如果有在文件中更改。

    第二次请求相同的文件

注意:

当我尝试在高级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,标题{“Accept-Ranges”= bytes; Connection =“Keep-Alive”;“Content-Length” = 221552;“Content-Type”=“audio / mpeg”; Date =“Wed,24 Feb 2016 14:57:53 GMT”; Etag =“\”36170-52c1cc36d9b40 \“”;“Keep-Alive”=“ “timeout = 5,max = 100”;“Last-Modified”=“Fri,19 Feb 2016 10:15:33 GMT”; Server =“Apache / 2.4.16(Unix)PHP / 5.5.29”;}})

我在这里做错了什么?

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

 request.cachePolicy = .ReloadIgnoringLocalAndRemoteCacheData 

你会没事的

CachePolicy的命名约定是混乱,更好,但实际上并没有实现其中的一些…

这篇文章解释得很好。 http://nshipster.com/nsurlcache/

此外,如果让caching策略使用UseProtocolCachePolicy则NSURLSession将接收状态码200并从caching中生成响应。

    Interesting Posts